1、order by 和limit导致索引失效问题
表中设置了三个索引:end_time,execute_state , event_type 三个独立索引。order by end_time limit 为1500 。分析结果type为range为索引范围查询,key为end_time索引。 extra为using index condition 使用到了索引。但是将limit改为6000结果为
结果为全表扫描。原因 mysql估算查询的行数可能会太多,范围查找优化将不会被使用。
在数据大的量下进行测试:
425205个
limit 为15400的时候 rows 值为418222 , mysql认为 近似425205 所以全表扫描了。
2、or 语句可能导致的全表扫描问题
总结 or语句可能会造成全表扫描。一般情况下 or 两边是不同字段会造成全表扫描,例如 A or B ,但是A or A 可能会使用索引也可能全表扫描,取决于rows值就是mysql会认为需要扫描多少数据。 通常A or A 会加一个限制,mysql会估算会扫描多少行。也可以加limit来限制取多少行,这样就可以继续使用索引。