优化mysql索引

时间:2011-11-18 01:38:14

标签: mysql optimization indexing

我有一个缓慢的(1.4秒)查询一直困扰我一段时间所以我只是想我会把它放好,看看是否有人可以帮助我优化我的索引来加快速度:

select sql_calc_found_rows t.id, q.im_id, concat(t.si_id, ' ', t.de), q.date, q.das, q.dac, u.name, q.ac, q.st
from t300q q
left join t300 t on t.id = q.con_id
left join users u on u.id = q.user_id
order by q.date desc limit 0,100

sql解释结果:

SIMPLE q ALL     89126 Using filesort
SIMPLE t eq_ref PRIMARY PRIMARY 4 db.q.con_id 1
SIMPLE u eq_ref PRIMARY PRIMARY 4 db.q.user_id 1

会话统计信息:

Handler_read_first = 0
Handler_read_key = 177934
Handler_read_next = 23
Handler_read_prev = 679
Handler_read_rnd = 15
Handler_read_rnd_next = 89127

我有以下索引:

t.id - primary key

q.con_id    |
q.date      | - all form a single index
q.user_id   |

u.id - primary key

从处理程序统计信息中可以看出,表q的大小为89126行。

这不是一个大问题,但如果可能,我希望此查询的速度低于1秒。

3 个答案:

答案 0 :(得分:1)

查询很慢,因为您没有日期索引。无法使用复合索引,因为日期位于中间。将日期移动到现有索引中的第一个字段或创建独立索引。

答案 1 :(得分:1)

BTW mysql仅对3列索引的前两列使用相等性。最后一列可以使用远程查询。

即:

WHERE x=? AND y=? order by z;

将使用列(x,y,z)的索引(因为z可以是范围)。

尝试将'date'移至第3列并重写查询。

如果这不起作用,那么mysql不够聪明,不能在连接中处理con_id和user_id。也许你可以重写它,以便那些连接条件发生在where子句中。

答案 2 :(得分:0)

尝试触发数据库上的OPTIMIZE或ANALYZE,但是如果在服务器上没有执行任何请求以避免任何问题,请确保在只有少量请求或更好的时间触发此操作你可能会在这个链接上看到关于这些陈述的更多信息:

http://dev.mysql.com/doc/refman/5.6/en/analyze-table.html http://dev.mysql.com/doc/refman/4.1/en/optimize-table.html