首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySQL索引问题

MySQL索引问题
EN

Database Administration用户
提问于 2011-09-16 16:14:49
回答 1查看 153关注 0票数 2

我有两个MyISAM表:

表:具有主键的search_hit : search_hit_id和外键: search_id (1.5亿行和不断插入)表:使用主键搜索: search_id (大约30,000行和不断增长)

search_hit表有许多索引,包括search_id,但是这个查询非常慢:

代码语言:javascript
复制
select sq.search_id, count(ssh.search_hit_id)
from search sq
inner join search_hit ssh 
use index(by_search_id) on sq.search_id = ssh.search_id
where sq.search_id >= 47000
group by sq.search_id

以下是解释结果:

代码语言:javascript
复制
1, 'SIMPLE', 'sq', 'range', 'PRIMARY', 'PRIMARY', '4', '', 202, 'Using where; Using index'
1, 'SIMPLE', 'ssh', 'ref', 'by_search_id', 'by_search_id', '4', 'lims.sq.search_id', 3358, ''

查询返回的状态类似: /* 0行受影响,找到1,575行。持续时间1次查询: 3.198秒。(+ 5.975秒)网络) */

我们的服务器在具有8GB双核的64位linux上安装了MySQL 5.0.45 (超线程quancore)。删除索引,优化表,然后在这里重新创建索引会有所帮助吗?

谢谢

大卫

EN

回答 1

Database Administration用户

发布于 2011-09-16 20:29:32

您必须重构查询,以执行WHERE、JOIN和GROUP BY子句的精确顺序!

以下是重构的查询:

代码语言:javascript
复制
select
    sq.search_id,
    count(1) search_id_count
from
    (select search_id from search where search_id > 47000) sq
    inner join
    (select search_id from search_hit where search_id > 47000) ssh
    using (search_id)
group by
    sq.search_id;

运行优化表(减少表碎片和重新创建索引)可能是不必要的,除非您执行大量的插入、更新和删除操作。我会说这是可选的。

试试看!!

票数 2
EN
页面原文内容由Database Administration提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://dba.stackexchange.com/questions/5874

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档