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

数据库 MySQL
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="郑州"

 

 

 

【编辑推荐】

现ADO连接MYSQL的实现

mysql触发器的三个状态

建立MySQL触发器的语法

mysql触发器的三个示例

Mysql聚合函数简介

责任编辑:段燃 来源: 互联网
相关推荐

2010-11-11 15:48:54

MySQL单列索引

2010-05-26 13:42:08

MySQL数据库索引

2010-10-12 16:50:14

MySQL Hash索

2023-01-06 10:52:30

SQL索引存储

2011-04-22 14:45:45

SQL索引

2017-09-04 16:03:46

MySQLMySQL索引索引

2015-10-30 15:55:43

MySQL

2020-09-28 15:34:38

ElasticSear索引MySQL

2010-10-12 13:37:54

mysql索引

2010-10-12 14:09:34

MySQL索引

2022-03-25 10:38:40

索引MySQL数据库

2011-03-31 13:51:54

MySQL索引

2019-09-25 15:09:30

MySQL索引SQL

2018-06-07 08:54:01

MySQL性能优化索引

2009-05-07 14:05:02

MySQL索引分类管理

2015-06-15 14:58:16

MySQL索引

2010-05-27 16:12:10

MySQL索引

2024-03-25 13:02:00

MySQL索引主键

2010-06-13 14:31:18

MySQL 5.0

2010-09-27 11:24:37

SQL聚簇索引
点赞
收藏

51CTO技术栈公众号