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="郑州"

转载于:https://www.cnblogs.com/opps/p/5004816.html

mysql 组合索引相关推荐

  1. mysql 组合索引 or_Mysql_组合索引和单列索引

    一.目标 什么时候使用组合索引,什么时候使用单独索引 组合索引.单独索引区别 组合索引:最左前缀匹配原则 二.前期数据准备 1. 建表 CREATE TABLE `user` ( `uid`int(1 ...

  2. mysql 组合索引 or_mysql索引优化实例(单列索引与组合索引)

    索引一般用于在数据规模大时对查询进行优化的一种机制,对于一般的查询来说,mysql会去遍历整个表,来查询符合要求的结果: 如果借助于mysql索引,mysql会将要索引的字段按照一定的算法进行处理,并 ...

  3. mysql组合索引与字段顺序

    转自:http://www.cnblogs.com/sunss/archive/2010/09/14/1826112.html 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有 ...

  4. Mysql组合索引使用和用法

    下列转自:http://www.tech-q.cn/archiver/tid-11673.html 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有使用到索引!一般来说,可能是 ...

  5. mysql组合索引,abc索引命中

    mysql联合索引,abc的争议实践 原因: 在一次和同事讨论mysql联合索引的面试题时出现了争议.主要问题是:a.b.c三个字段作为联合索引,b.c:和a.c情况到底会不会命中索引? 网上查阅相关 ...

  6. mysql组合索引没效果的原因

    1.联合索引失效的条件 联合索引又叫复合索引.两个或更多个列上的索引被称作复合索引. 对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引 ...

  7. MySQL组合索引(多列索引)使用与优化

    一.多列索引 我们经常听到一些人说"把WHERE条件里的列都加上索引",其实这个建议非常错误.在多个列上建立单独的索引大部分情况下并不能提高MySQL的查询性能.MySQL在5.0 ...

  8. mysql 组合索引 in_mysql组合索引与字段顺序

    转自:http://www.cnblogs.com/sunss/archive/2010/09/14/1826112.html 很多时候,我们在mysql中创建了索引,但是某些查询还是很慢,根本就没有 ...

  9. mysql组合索引 唯一_(四):MySQL建立索引,唯一索引和组合索引

    # (四):MySQL建立索引,唯一索引和组合索引 先大致介绍下项目的数据库信息. 数据库A:主要存放的通用的表,如User.Project.Report等. 数据库B.C.D:一个项目对应一个数据库 ...

最新文章

  1. 现金支付没落?澳大利亚一年内移除数百台ATM机
  2. 知乎高赞回答:是否有必要系统学习概率图模型?
  3. java jdbc 连接mysql数据库,Java 通过JDBC连接Mysql数据库
  4. 矩阵中不重复的元素(51Nod-1024)
  5. log4j 源码解析_log4j2源码解析(2)--LoggerContext
  6. mat查找多线程并发下大对象导致的堆内存问题
  7. Boosting and AdaBoost
  8. 移植UE4的Spline与SplineMesh组件到Unity5
  9. 登陆界面输入框内加入小图标的样式
  10. 技嘉Z370 HD3P + i7-8700K + GTX1080 装黑苹果 High Sierra 10.13.6
  11. rime android汉字,Rime输入法
  12. 普源DG5000系列函数/任意波形发生器功能解析
  13. 突发,拼多多发生重大变更!
  14. 基于JS/H5实现二维码扫码增强版-带视频演示
  15. 内存(DDR/DDR2/DDR3/DDR4)的速度等级和时钟频率———个人笔记
  16. Surface电池阈值
  17. 机器学习----维数灾难
  18. hibernate一对一主键唯一外键关联(二)
  19. 因式分解机(Factorization Machines,FM )
  20. centos 4.4 智能DNS解决南北互通方案

热门文章

  1. c语言怎么样文件存储数据,急求如何将下列C语言程序数据存储到文件中?
  2. 计算机里有个不能进入的磁盘分区,新电脑只有一个分区怎么办? 教你们如何不进pe给硬盘创建新分区!...
  3. 前向验证对于模型的更新作用
  4. strictmath_Java StrictMath ulp()方法与示例
  5. 软件开发模型和软件过程模型_什么是软件和软件过程?
  6. Java ResourceBundle keySet()方法及示例
  7. python中bool函数_bool()函数以及Python中的示例
  8. java split 坑_java String split 踩坑记
  9. python实现实时监控_基于 Python 的交换机实时监控系统的设计与实现
  10. linux操作系统之线程同步及互斥量