`
yuri_liuyu
  • 浏览: 176025 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

最左前缀原则

阅读更多

这两天看《构建高性能Web站点》这本书,感觉写的真是不错,很多实际项目中会碰到的问题都有所提及,今天看到一个最左前缀原则,以前也听说过,不过一直没搞明白,今天查了下。

 

通过实例理解单列索引、多列索引以及最左前缀原则

实例:现在我们想查出满足以下条件的用户id:
mysql>SELECT `uid` FROM people WHERE 
lname`='Liu'  AND `fname`='Zhiqun' AND `age`=26
因为我们不想扫描整表,故考虑用索引。

单列索引:
ALTER TABLE people ADD INDEX lname (lname);
将lname列建索引,这样就把范围限制在lname='Liu'的结果集1上,之后扫描结果集1,产生满足fname='Zhiqun'的结果集2,再扫描结果集2,找到 age=26的结果集3,即最终结果。

由 于建立了lname列的索引,与执行表的完全扫描相比,效率提高了很多,但我们要求扫描的记录数量仍旧远远超过了实际所需 要的。虽然我们可以删除lname列上的索引,再创建fname或者age 列的索引,但是,不论在哪个列上创建索引搜索效率仍旧相似。

2.多列索引:

ALTER TABLE people ADD INDEX lname_fname_age (lame,fname,age);
为了提高搜索效率,我们需要考虑运用多列索引,由于索引文件以B-Tree格式保存,所以我们不用扫描任何记录,即可得到最终结果。

注:在mysql中执行查询时,只能使用一个索引,如果我们在lname,fname,age上分别建索引,执行查询时,只能使用一个索引,mysql会选择一个最严格(获得结果集记录数最少)的索引。

3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。

注:在创建多列索引时,要根据业务需求,where子句中使用最频繁的一列放在最左边。

分享到:
评论
4 楼 pc_cool 2012-12-19  
我在看这本书,刚好看到这个块了,不懂之处,还要向楼主请教,呵呵
3 楼 yuri_liuyu 2012-11-05  
gds_fighting 写道
兄台说“3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。”。

对于这句话,我有些疑问。不是说mysql一次查询只能使用一个索引么?你这里说多列索引相当于多个索引组合而成,那到底用哪个呢,效率感觉没有提高啊。。。

mysql每次确实只会用到它认为效率最高的一个索引。如果数据量不大,其实建立复杂索引的意义也不大。并且要确认确实用到了索引,可以explain一下。

比如文章中举的那个例子,如果sql写成这样:
SELECT `uid` FROM people WHERE lname`='Liu'  AND `fname`='Zhiqun' AND `age`=26便可以用到我们建的组合索引(lname,fname,age)。
如果sql写成这样
SELECT `uid` FROM people WHERE lname`='Liu'  AND `fname`='Zhiqun' 同样可以用到我们建的组合索引。只是这时候是按照(lname,fname)这个索引组合去查的
但是如果sql写成这样
SELECT `uid` FROM people WHERE fname`='Zhiqun'AND `age`=26便无法用到定义的索引了。

建议看下mysql中innodb中B-Tree索引的结构,一看便知为何。
2 楼 gds_fighting 2012-10-24  
兄台说“3.最左前缀:顾名思义,就是最左优先,上例中我们创建了lname_fname_age多列索引,相当于创建了(lname)单列索引,(lname,fname)组合索引以及(lname,fname,age)组合索引。”。

对于这句话,我有些疑问。不是说mysql一次查询只能使用一个索引么?你这里说多列索引相当于多个索引组合而成,那到底用哪个呢,效率感觉没有提高啊。。。
1 楼 Kensai 2011-06-22  
最近我也在看《构建高性能Web站点》确实不错。感谢楼主解释最左前缀原理,我查了n多地方都没解释清楚。

相关推荐

Global site tag (gtag.js) - Google Analytics