我有两个MyISAM表:
表:具有主键的search_hit : search_hit_id和外键: search_id (1.5亿行和不断插入)表:使用主键搜索: search_id (大约30,000行和不断增长)
search_hit表有许多索引,包括search_id,但是这个查询非常慢:
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以下是解释结果:
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)。删除索引,优化表,然后在这里重新创建索引会有所帮助吗?
谢谢
大卫
发布于 2011-09-16 20:29:32
您必须重构查询,以执行WHERE、JOIN和GROUP BY子句的精确顺序!
以下是重构的查询:
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;运行优化表(减少表碎片和重新创建索引)可能是不必要的,除非您执行大量的插入、更新和删除操作。我会说这是可选的。
试试看!!
https://dba.stackexchange.com/questions/5874
复制相似问题