Home  >  Article  >  Database  >  MySQL单列索引和组合索引的区别介绍_MySQL

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

WBOY
WBOYOriginal
2016-05-30 17:10:161239browse

MySQL单列索引是我们使用MySQL数据库中经常会见到的,MySQL单列索引和组合索引的区别可能有很多人还不是十分的了解,下面就为您分析两者的主要区别,供您参考学习。

 

为了形象地对比两者,再建一个表:

 

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;

 

首先考虑建MySQL单列索引:

 

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

 

虽然在 vc_Name 上建立了索引,查询时MYSQL不用扫描整张表,效率有所提高,但离我们的要求还有一定的距离。同样的,在 vc_City 和 i_Age 分别建立的MySQL单列索引的效率相似。

 

为了进一步榨取 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="郑州"

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn