近期查看业务数据库的慢查询,发现一条查询,平均要4s才能结束,查了表里的数据,表中只有400多万条数据,不应该这么慢呀。看了一下mysql的监控,内存使用率85%,想着可能是内存不够用,扩了一下内存,内存使用率15%,同样的查询语句还是慢。记录了一下解决过程。
1.用explain分析一下查询语句
explain select * from picquery where task_id=1 and state=1 order by id limit 1 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: picquery
partitions: NULL
type: index
possible_keys: picquery_task_id_1dddd3f3_fk_task_id,task_id_state_annotator_id
key: PRIMARY
key_len: 8
ref: NULL
rows: 11
filtered: 0.14
Extra: Using where
发现实际走的索引是主键,没有用到idx_task_id_state_annotator_id,很奇怪没有用到这个索引。
2.去掉查询语句中的order_by
explain select * from engine_picquery where task_id=1 and state=1 limit 1 \G;
*************************** 1. row ***************************
id: 1
select_type: SIMPLE
table: engine_picquery
partitions: NULL
type: ref
possible_keys: picquery_task_id_1dddd3f3_fk_task_id,task_id_state_annotator_id
key: task_id_state_annotator_id
key_len: 8
ref: const,const
rows: 23456
filtered: 100.00
Extra: NULL
去掉order_by之后,就选择正确的索引了
3.解决方案
在sql语句中加入 force index(xxxxx), 强制使用指定的索引