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组合索引与字段顺序

转自:sunada 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是某些字段没有创建索引,或者是组合索引中字段的顺序与查询语句中字段的顺序...
  • gang_strong
  • gang_strong
  • 2017-01-09 15:26:03
  • 3354

MySQL中复合索引中列的顺序对性能的影响

先看上面这个内联的SQL语句,username是dlog_user表的主键,dlog_friend有一个由 username和 friend_username组合而成的复合主键。 测试条件一: ...
  • hpulfc
  • hpulfc
  • 2017-02-28 13:21:21
  • 342

SQL 索引最左前缀原理

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

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

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

mysql多列索引和最左前缀

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

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

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

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

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

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

MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习。   为了形象地对比两者,...
  • ssssny
  • ssssny
  • 2017-05-23 14:19:34
  • 1297

Mysql中的联合索引、前缀索引、覆盖索引

Mysql中的联合索引、前缀索引、覆盖索引索
  • Air_hjj
  • Air_hjj
  • 2017-04-16 13:09:01
  • 1737

MySQL索引之组合索引

一、概念 单列索引:即一个索引只包含单个列,一个表可以有多个单列索引,但这不是组合索引; 组合索引:即一个索引包含多个列; 1.当查询where条件只有一个时,完全可以利用单列索引,因为这样速度可...
  • only09080229
  • only09080229
  • 2015-01-05 15:41:11
  • 426
收藏助手
不良信息举报
您举报文章:mysql组合索引最左前缀
举报原因:
原因补充:

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