我有以下查询:
EXPLAIN SELECT *
FROM glean2_saves
WHERE username = '1d85d5aed8b02b3d6b0c155a563293ef'
AND ses_id = 'e4fa3ae216f5033fbd16d6c66370954c'
AND save_status =1
ORDER BY id DESC
结果如下:
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE glean2_saves ref save_status,username,ses_id save_status 2 const 286315 Using where; Using filesort
以下是我的索引:
Action Keyname Type Unique Packed Column Cardinality Collation Null Comment
Edit Edit Drop Drop PRIMARY BTREE Yes No id 331837 A
Edit Edit Drop Drop save_status BTREE No No save_status 3 A YES
Edit Edit Drop Drop nickname FULLTEXT No No nickname 7374 YES
Edit Edit Drop Drop username FULLTEXT No No username 7717 YES
Edit Edit Drop Drop ses_id FULLTEXT No No ses_id 11442 YES
我的右栏有索引,但为什么不使用? 为什么他们在“可能的键”(save_status,username,ses_id)中,但实际上只使用了一个“键”:save_status
如果没有索引,查询会占用太长时间(有时超过15秒),它应该不到一秒钟。该数据库超过330k条目。
答案 0 :(得分:2)
对于此查询,您需要一个索引,该索引涵盖where
和order by
子句。该指数将是:
glean2_saves(username, ses_id, save_status, id)
请注意,因为您正在进行相等比较,所以前三列可以按任何顺序排列。但id
的最后一列需要为order by
。
至于为什么 MySQL没有使用单个索引。我们只是说合并where
子句的索引是很多工作,并且可能导致比扫描一个索引和对其余列进行测试更多的工作。