复合索引最令人困惑的当属索引列的顺序。不仅依赖于使用该索引的查询,更需考虑排序和分组。



前段时候我发了个帖子:where条件顺序和复合索引字段顺序。感兴趣的朋友最好还是參与讨论。


今天我提个自己的观点。

在应用开发阶段,【选择性】是我们首要考虑因素,请看简图:


当出现sql性能问题时,你可能须要注意下面几个:



1. 随机IO



2. 排序(order by)



3. 分组(group by or distinct)



这时不必也不应该在关注【选择性】



我的经验便是。在你手上已经有Top N SQL时,我们应该优先考虑【值的分布】。而不是选择性。






那么该怎样推断【值的分布】,我们通过一种被geek称之为 【sarg】的方法,详细操作例如以下:



假如,我们有例如以下query:



select * from userresult_f where askid=800808 and uid=110996854;



则有2个索引可供选择:



1. idx_1 (askid,uid)



2. idx_2 (uid,askid)



是1 还是2 ?



利用【sarg】方法:



mysql> select sum(askid=800808),sum(uid=110996854) from userresult_f\G;
*************************** 1. row ***************************
sum(askid=800808): 6
sum(uid=110996854): 2
1 row in set (0.00 sec)



根据查询输出。我们应该选择 idx_2






By 数据牧羊人



Good Luck!



2014-4-27 19:05  于福州









复合索引最令人困惑的当属索引列的顺序。不仅依赖于使用该索引的查询,更需考虑排序和分组。



前段时候我发了个帖子:where条件顺序和复合索引字段顺序。感兴趣的朋友最好还是參与讨论。



今天我提个自己的观点。

在应用开发阶段,【选择性】是我们首要考虑因素,请看简图:






当出现sql性能问题时,你可能须要注意下面几个:



1. 随机IO



2. 排序(order by)



3. 分组(group by or distinct)



这时不必也不应该在关注【选择性】



我的经验便是。在你手上已经有Top N SQL时,我们应该优先考虑【值的分布】。而不是选择性。






那么该怎样推断【值的分布】,我们通过一种被geek称之为 【sarg】的方法,详细操作例如以下:



假如,我们有例如以下query:



select * from userresult_f where askid=800808 and uid=110996854;



则有2个索引可供选择:



1. idx_1 (askid,uid)



2. idx_2 (uid,askid)



是1 还是2 ?



利用【sarg】方法:



mysql> select sum(askid=800808),sum(uid=110996854) from userresult_f\G;
*************************** 1. row ***************************
sum(askid=800808): 6
sum(uid=110996854): 2
1 row in set (0.00 sec)



根据查询输出。我们应该选择 idx_2






By 数据牧羊人



Good Luck!



2014-4-27 19:05  于福州