mysql组合索引最左前缀

转载 2016年09月12日 18:07:31

原文出处:http://www.justwinit.cn/post/1935/

create TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREMENT, vc_Name VARCHAR(50) NOT NULL, vc_City VARCHAR(50) NOT NULL, i_Age INT NOT NULL, i_SchoolID INT NOT NULL, PRIMARY KEY (i_testID) );


    在这10000条记录里面7上8下地分布了5条vc_Name="erquan"的记录,只不过city,age,school的组合各不相同。
  来看这条T-SQL:
    select i_testID FROM myIndex where vc_Name='erquan' AND vc_City='郑州' AND i_Age=25;

    首先考虑建单列索引:
     在vc_Name列上建立了索引。执行T-SQL时,MYSQL很快将目标锁定在了vc_Name=erquan的5条记录上,取出来放到一中间结果集。在这个结果集里,先排除掉vc_City不等于"郑州"的记录,再排除i_Age不等于25的记录,最后筛选出唯一的符合条件的记录。

    虽然在vc_Name上建立了索引,查询时MYSQL不用扫描整张表,效率有所提高,但离我们的要求还有一定的距离。同样的,在vc_City和i_Age分别建立的单列索引的效率相似。 
    为了进一步榨取MySQL的效率,就要考虑建立组合索引。就是将vc_Name,vc_City,i_Age建到一个索引里:
    alter TABLE myIndex ADD INDEX name_city_age (vc_Name(10),vc_City,i_Age);--注意了,建表时,vc_Name长度为50,这里为什么用10呢?因为一般情况下名字的长度不会超过10,这样会加速索引查询速度,还会减少索引文件的大小,提高insert的更新速度。

    执行T-SQL时,MySQL无须扫描任何记录就到找到唯一的记录!!

     肯定有人要问了,如果分别在vc_Name,vc_City,i_Age上建立单列索引,让该表有3个单列索引,查询时和上述的组合索引效率一样吧?嘿嘿,大不一样,远远低于我们的组合索引~~虽然此时有了三个索引,但MySQL只能用到其中的那个它认为似乎是最有效率的单列索引。

    建立这样的组合索引,其实是相当于分别建立了
        vc_Name,vc_City,i_Age
        vc_Name,vc_City
        vc_Name
    这样的三个组合索引!为什么没有vc_City,i_Age等这样的组合索引呢?这是因为mysql组合索引"最左前缀"的结果。简单的理解就是只从最左面的开始组合。并不是只要包含这三列的查询都会用到该组合索引,下面的几个T-SQL会用到:
    select * FROM myIndex WHREE vc_Name="erquan" AND vc_City="郑州"
    select * FROM myIndex WHREE vc_Name="erquan"
而下面几个则不会用到:
    select * FROM myIndex WHREE i_Age=20 AND vc_City="郑州"
    select * FROM myIndex WHREE vc_City="郑州"

MySQL_MySQL 联合索引详解 以及注意事项

联合索引又叫复合索引。对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分。例如索引是key index (a,b,c). 可以支持a | a,...
  • u010003835
  • u010003835
  • 2016年06月02日 07:52
  • 4782

MySQL单列索引和组合索引的区别介绍

MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习。   为了形象地对比两者,再建...
  • weiqubo
  • weiqubo
  • 2015年12月10日 23:30
  • 7013

SQL 索引最左前缀原理

表结构和索引列假设数据库中表是这样的: 我们只考虑一张表employees.titles: 索引是(emp_no,title,from_date)SHOW INDEX FROM employees...
  • zly9923218
  • zly9923218
  • 2016年05月06日 13:42
  • 3075

mysql多列索引和最左前缀

数据库的索引可以加快查询速度,原因是索引使用特定的数据结构(B-Tree)对特定的列额外组织存放,加快存储引擎(索引是存储引擎实现)查找记录的速度。 索引优化是数据库优化的最重要手段。 如果查...
  • z69183787
  • z69183787
  • 2015年07月02日 21:55
  • 2437

数据库性能优化1——正确建立索引以及最左前缀原则

1. 索引建立的原则 用于索引的最好的备选数据列是那些出现在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。 仅仅出现在SELECT关键字后面的输出数据列列表中的数据列...
  • zhanglu0223
  • zhanglu0223
  • 2013年03月24日 16:58
  • 17322

MySql最左前缀原则

昨天做一个企业的笔试题,对数据库这块了解很浅,所以还是记录一下吧。B-Tree 索引和 Hash 索引的对比 对于 B-tree 和 hash 数据结构的理解能够有助于预测不同存储引擎下使用不同索引...
  • SkySuperWL
  • SkySuperWL
  • 2016年09月19日 10:35
  • 6470

正确建立索引以及最左前缀原则

1. 索引建立的原则 用于索引的最好的备选数据列是那些出现在WHERE子句、join子句、ORDER BY或GROUP BY子句中的列。 仅仅出现在SELECT关键字后面的输出数据列列表中的数...
  • z69183787
  • z69183787
  • 2015年07月02日 21:56
  • 3412

数据库3_最左前缀原则

这两天看《构建高性能Web站点》这本书,感觉写的真是不错,很多实际项目中会碰到的问题都有所提及,今天看到一个最左前缀原则,以前也听说过,不过一直没搞明白,今天查了下。   通过实例理解单列...
  • wang_zhenwei
  • wang_zhenwei
  • 2016年10月13日 10:36
  • 491

mysql组合索引"最左前缀"的结果。简单的理解就是只从最左面的开始组合

原文出处:http://www.justwinit.cn/post/1935/ create TABLE myIndex ( i_testID INT NOT NULL AUTO_INCREME...
  • shangxiaoxue
  • shangxiaoxue
  • 2012年04月26日 14:21
  • 4718

mysql索引的最左前缀原则

联合索引有一个最左前缀原则,所以建立联合索引的时候,这个联合索引的字段顺序非常重要 下面写了例子说明这个:CREATE TABLE `test_myisam` ( `id` int(11) NO...
  • topwqp
  • topwqp
  • 2016年07月30日 09:07
  • 2477
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql组合索引最左前缀
举报原因:
原因补充:

(最多只允许输入30个字)