最佳左前缀特性

如果我们创建了(a, b, c)的复合索引,那么其实相当于创建了(a,b,c)、(a,b)、(a)三个索引,这被称为最佳左前缀特性。

一个例子

以index(a,b,c)复合索引为例:

语句 索引是否生效
where a = 1 是,字段 a 索引生效
where a = 1 and b = 2 是,字段 a 和 b 索引生效
where a = 1 and b = 2 and c = 3 是,全部生效
where b = 2 或 where c = 3
where a = 1 and c = 3 字段 a 生效,字段 c 失效
where a = 1 and b > 2 and c = 3 字段 a,b 生效,字段 c 失效
where a = 1 and b like 'xxx%' and c = 3 字段 a,b 生效,字段 c 失效

【注意】上表最后两行,字段c失效的原因是:mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配。详见下面详述

联合索引的常见注意事项

(摘自:mysql建索引的几大原则_10931853的技术博客_51CTO博客 仅做个人备份,浏览请看原文)

1.选择唯一性索引

唯一性索引的值是唯一的,可以更快速的通过该索引来确定某条记录。例如,学生表中学号是具有唯一性的字段。为该字段建立唯一性索引可以很快的确定某个学生的信息。如果使用姓名的话,可能存在同名现象,从而降低查询速度。

2.为经常需要排序、分组和联合操作的字段建立索引

经常需要ORDER BY、GROUP BY、DISTINCT和UNION等操作的字段,排序操作会浪费很多时间。如果为其建立索引,可以有效地避免排序操作。

3.为常作为查询条件的字段建立索引

如果某个字段经常用来做查询条件,那么该字段的查询速度会影响整个表的查询速度。因此,为这样的字段建立索引,可以提高整个表的查询速度。

4.限制索引的数目

索引的数目不是越多越好。每个索引都需要占用磁盘空间,索引越多,需要的磁盘空间就越大。修改表时,对索引的重构和更新很麻烦。越多的索引,会使更新表变得很浪费时间。

5.尽量使用数据量少的索引

如果索引的值很长,那么查询的速度会受到影响。例如,对一个CHAR(100)类型的字段进行全文检索需要的时间肯定要比对CHAR(10)类型的字段需要的时间要多。

6.尽量使用前缀来索引

如果索引字段的值很长,最好使用值的前缀来索引。例如,TEXT和BLOG类型的字段,进行全文检索会很浪费时间。如果只检索字段的前面的若干个字符,这样可以提高检索速度。

7.删除不再使用或者很少使用的索引

表中的数据被大量更新,或者数据的使用方式被改变后,原有的一些索引可能不再需要。数据库管理员应当定期找出这些索引,将它们删除,从而减少索引对更新操作的影响。

8 . 最左前缀匹配原则,非常重要的原则。

mysql会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配,比如a 1=”” and=”” b=”2” c=”“> 3 and d = 4 如果建立(a,b,c,d)顺序的索引,d是用不到索引的,如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整。

9 .=和in可以乱序。

比如a = 1 and b = 2 and c = 3 建立(a,b,c)索引可以任意顺序,mysql的查询优化器会帮你优化成索引可以识别的形式

10 . 尽量选择区分度高的列作为索引。

区分度的公式是count(distinct col)/count(*),表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、性别字段可能在大数据面前区分度就 是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条 记录

11 .索引列不能参与计算,保持列“干净”。

比如from_unixtime(create_time) = ’2014-05-29’就不能使用到索引,原因很简单,b+树中存的都是数据表中的字段值,但进行检索时,需要把所有元素都应用函数才能比较,显然成本 太大。所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

12 .尽量的扩展索引,不要新建索引。 
比如表中已经有a的索引,现在要加(a,b)的索引,那么只需要修改原来的索引即可

注意:选择索引的最终目的是为了使查询的速度变快。上面给出的原则是最基本的准则,但不能拘泥于上面的准则。读者要在以后的学习和工作中进行不断的实践。根据应用的实际情况进行分析和判断,选择最合适的索引方式。

#### mysql联合索引 注意事项 ####相关推荐

  1. mysql联合索引,联合索引使用的注意事项

    1.学习了mysql联合索引,以及联合索引使用的注意事项. 联合索引:MySQL中使用多个字段同时建立一个索引联合索引. 在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序一次使用,否则无法 ...

  2. 关于MySQL联合索引和优化军规

    一.关于MySQL联合索引 总结记录一下关于在MySQL中使用联合索引的注意事项. 如:索引包含表中每一行的last_name.first_name和dob列,即key(last_name, firs ...

  3. mysql联合索引的数据结构

    一.本文主要讲解的内容有: 联合索引在B+树上的存储结构 联合索引的查找方式 为什么会有最左前缀匹配原则 在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多 ...

  4. mysql 联合索引详解

    mysql 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). ...

  5. 找到符合条件的索引_高频面试题:MySQL联合索引的最左前缀匹配原则

    前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...

  6. mysql联合索引测试

    mysql联合索引和查询条件的匹配原则: 只有当联合索引的第一个字段在where条件中出现时,才会使用索引查询,不然就是全表扫描查询. 表的索引为: KEY `Index_query` (`trans ...

  7. mysql 联合索引 range_MySQL 联合索引使用情况

    验证联合索引使用的情况 索引是一个排序的结构,用于快速检索和加速排序 MySQL表结构 index_test | CREATE TABLE `index_test` ( `c1` char(10) N ...

  8. SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引

    我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...

  9. MySQL联合索引以及索引顺序优化

    MySQL联合索引以及索引顺序优化 1. 环境准备 2. 测试验证 1. 环境准备 -- 查看版本 ,5.7.19-17-log select VERSION();-- 创建表结构 CREATE TA ...

最新文章

  1. 跳至下一个断点_基金经理:DeFi将推动以太坊在下一个上涨周期中涨至9000美元...
  2. Java基础:常见对象
  3. xpath IE 7
  4. python扩展文件_1. 使用 C 或 C++ 扩展 Python
  5. Python爬虫利器四PhantomJS的用法
  6. 游山玩水拈花惹草 --- SAP 顾问出差期间自娱自乐的妙招
  7. [转载] 1.1.1 Python常用的数学函数
  8. java递推_【Java】递归递推的应用
  9. 游戏运行库java下载官网_游戏运行库合集安装包(Visual C++,Microsoft .NET,Microsoft XNA,Microsoft XML等几十种)...
  10. 荣耀手机动态修改手机型号参数
  11. 数仓建模—事实表和维度表设计规范
  12. 数字传感器:新兴的应用
  13. Android开发蓝牙篇之蓝牙设备开启、搜索周边蓝牙设备
  14. tl431 输出接104 振荡
  15. php之form,PHP之表单处理
  16. 10张图了解UWB技术的工作原理
  17. SQL Server小数取整
  18. 【Windows】台式机cpu骤升100%
  19. Cnopendata唐诗宋词数据
  20. (PTA)7-7 计算油费 (15分)

热门文章

  1. 蓝牙协议spec文档免费下载官网下载(免费)
  2. Vue 使用 yarn 报错
  3. Java之数组实现增删改
  4. rabbitMQ实例(java)
  5. mysql区间算法_「五大常用算法」一文图解分治算法和思想
  6. C语言函数如何正确的输入和返回数组(一维和二维)
  7. android面试自我介绍范文,2022年Android技术下半场在哪
  8. 钝化程序模式SOA架构BPM
  9. C#基础 uint,long,ulong,float,decimal 定义并初始化
  10. MATLAB中的乘除法 “ * ” 和 “ .* ” and “ / ” 和 “ ./ ”