码迷,mamicode.com
首页 > 其他好文 > 详细

复合索引的列顺序判断

时间:2017-08-02 15:04:34      阅读:164      评论:0      收藏:0      [点我收藏+]

标签:etl   cal   bae   bsp   u3d   bcp   set   alt   cm5   

复合索引最令人困惑的当属索引列的顺序,不仅依赖于使用该索引的查询,更需考虑排序和分组。
前段时候我发了个帖子:where条件顺序和复合索引字段顺序。感兴趣的朋友不妨参与讨论。
今天我提个自己的观点。
在应用开发阶段,【选择性】是我们首要考虑因素,请看简图:
技术分享
当出现sql性能问题时,你可能需要注意以下几个:
1. 随机IO
2. 排序(order by)
3. 分组(group by or distinct)
这时不必也不应该在关注【选择性】
我的经验便是,在你手上已经有Top N SQL时,我们应该优先考虑【值的分布】,而不是选择性。
 
那么该如何判断【值的分布】,我们通过一种被geek称之为 【sarg】的方法,具体操作如下:
假如,我们有如下query:
  1. select * from userresult_f where askid=800808 and uid=110996854;  
select * from userresult_f where askid=800808 and uid=110996854;
则有2个索引可供选择:
1. idx_1 (askid,uid)
2. idx_2 (uid,askid)
是1 还是2 ?
利用【sarg】方法:
  1. mysql> select sum(askid=800808),sum(uid=110996854) from userresult_f\G;  
  2. *************************** 1. row ***************************  
  3. sum(askid=800808): 6  
  4. sum(uid=110996854): 2  
  5. 1 row in set (0.00 sec)  
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  于福州

复合索引的列顺序判断

标签:etl   cal   bae   bsp   u3d   bcp   set   alt   cm5   

原文地址:http://www.cnblogs.com/firstdream/p/7273674.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!