一、支持多种过滤条件
案例一、IN()技术
(sex,country,region,age)和(sex,country,region,city,age)这样的组合索引 分析:
性别,全部国家列表,或国家的全部地区列表。通过IN()技术实现。
案例二、范围查询放在最后
因查询只能使用最左前缀,直到遇到第一个范围条件列。故尽可能把范围查询放到索引的后面,以便优化器使用尽可能多的索引列。
注意:
每增加一个IN()条件,优化器需要做的的组合都将以指数形式增加,最终可能会极大降低查询性能。
新版本MySQL在组合数超过一定数量将不再进行执行计划评估,可能会导致MySQL不能很好的利用索引。
二、避免多个范围条件
范围条件查询
SELECT * FROM t1
WHERE key_col > 1
AND key_col < 10;
等值条件查询
SELECT * FROM t1
WHERE key_col = 1
OR key_col IN (15,18,20);
范围查询和等值查询效率:
MySQL无法使用范围列后面的其他索引列。
多个等值条件查询则没有改限制。
待核实问题:MySQL支持松散索引扫描
三、优化排序
百万数据表的翻页问题:因为随着偏移量的增加,MySQL需要花费大量时间来扫描需要丢弃的数据。
解决方案:
反范式化、预先计算、缓存
限制用户翻页数量
延迟关联