#### mysql联合索引 注意事项 ####
最佳左前缀特性
如果我们创建了(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联合索引 注意事项 ####相关推荐
- mysql联合索引,联合索引使用的注意事项
1.学习了mysql联合索引,以及联合索引使用的注意事项. 联合索引:MySQL中使用多个字段同时建立一个索引联合索引. 在联合索引中,如果想要命中索引,需要按照建立索引时的字段顺序一次使用,否则无法 ...
- 关于MySQL联合索引和优化军规
一.关于MySQL联合索引 总结记录一下关于在MySQL中使用联合索引的注意事项. 如:索引包含表中每一行的last_name.first_name和dob列,即key(last_name, firs ...
- mysql联合索引的数据结构
一.本文主要讲解的内容有: 联合索引在B+树上的存储结构 联合索引的查找方式 为什么会有最左前缀匹配原则 在分享这篇文章之前,我在网上查了关于MySQL联合索引在B+树上的存储结构这个问题,翻阅了很多 ...
- mysql 联合索引详解
mysql 联合索引详解 联合索引又叫复合索引.对于复合索引:Mysql从左到右的使用索引中的字段,一个查询可以只使用索引中的一部份,但只能是最左侧部分.例如索引是key index (a,b,c). ...
- 找到符合条件的索引_高频面试题:MySQL联合索引的最左前缀匹配原则
前言 之前在网上看到过很多关于mysql联合索引最左前缀匹配的文章,自以为就了解了其原理,最近面试时和面试官交流,发现遗漏了些东西,这里自己整理一下这方面的内容. 最左前缀匹配原则 在mysql建立联 ...
- mysql联合索引测试
mysql联合索引和查询条件的匹配原则: 只有当联合索引的第一个字段在where条件中出现时,才会使用索引查询,不然就是全表扫描查询. 表的索引为: KEY `Index_query` (`trans ...
- mysql 联合索引 range_MySQL 联合索引使用情况
验证联合索引使用的情况 索引是一个排序的结构,用于快速检索和加速排序 MySQL表结构 index_test | CREATE TABLE `index_test` ( `c1` char(10) N ...
- SQL Server中的联合主键、聚集索引、非聚集索引、mysql 联合索引
我们都知道在一个表中当需要2列以上才能确定记录的唯一性的时候,就需要用到联合主键,当建立联合主键以后,在查询数据的时候性能就会有很大的提升,不过并不是对联合主键的任何列单独查询的时候性能都会提升,但我 ...
- MySQL联合索引以及索引顺序优化
MySQL联合索引以及索引顺序优化 1. 环境准备 2. 测试验证 1. 环境准备 -- 查看版本 ,5.7.19-17-log select VERSION();-- 创建表结构 CREATE TA ...
最新文章
- 跳至下一个断点_基金经理:DeFi将推动以太坊在下一个上涨周期中涨至9000美元...
- Java基础:常见对象
- xpath IE 7
- python扩展文件_1. 使用 C 或 C++ 扩展 Python
- Python爬虫利器四PhantomJS的用法
- 游山玩水拈花惹草 --- SAP 顾问出差期间自娱自乐的妙招
- [转载] 1.1.1 Python常用的数学函数
- java递推_【Java】递归递推的应用
- 游戏运行库java下载官网_游戏运行库合集安装包(Visual C++,Microsoft .NET,Microsoft XNA,Microsoft XML等几十种)...
- 荣耀手机动态修改手机型号参数
- 数仓建模—事实表和维度表设计规范
- 数字传感器:新兴的应用
- Android开发蓝牙篇之蓝牙设备开启、搜索周边蓝牙设备
- tl431 输出接104 振荡
- php之form,PHP之表单处理
- 10张图了解UWB技术的工作原理
- SQL Server小数取整
- 【Windows】台式机cpu骤升100%
- Cnopendata唐诗宋词数据
- (PTA)7-7 计算油费 (15分)
热门文章
- 蓝牙协议spec文档免费下载官网下载(免费)
- Vue 使用 yarn 报错
- Java之数组实现增删改
- rabbitMQ实例(java)
- mysql区间算法_「五大常用算法」一文图解分治算法和思想
- C语言函数如何正确的输入和返回数组(一维和二维)
- android面试自我介绍范文,2022年Android技术下半场在哪
- 钝化程序模式SOA架构BPM
- C#基础 uint,long,ulong,float,decimal 定义并初始化
- MATLAB中的乘除法 “ * ” 和 “ .* ” and “ / ” 和 “ ./ ”