`
dwj147258
  • 浏览: 194114 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Mysql索引

阅读更多

Mysql常用的索引:

一、聚集索引(聚簇索引):一般是主键,注意一般是主键,有可能不是主键,主要数据行的物理地址和与列值的逻辑顺序一致,一个表中一般只有一个聚集索引。

二、非聚集(聚簇)索引(又叫辅助索引-->聚集索引以外的任何表中的索引都可以称为辅助索引)

2.1.普通索引:index(加速查找)

2.2 唯一索引 UNIQUE KEY (不能重复)

2.3 联合索引(复合索引、覆盖索引(特殊简称,只要获取联合索引里面的值))

    3.1 联合主键索引 (id,name)

    3.2 联合唯一索引 (id,name)

    3.3 联合普通索引(id,name)

Mysql建立索引的一般原则:

1.最左前缀匹配(非常重要):mysql会一直向右匹配,直到遇到范围查询(<、>、between、like)即停止匹配,比如a=1 and b =2 and c >3 and d = 4,如果建立的索引是(a,b,c,d),那么d是用不到索引的(注意不是说这种情况使用不到索引,而是仅仅是d不能使用索引,因为在c>3查询之后的话就会通过主键索引去查询对应记录了),但是如果建立的是(a,b,d,c)那么是可以使用的,因为mysql会做优化,所以a,b,d的顺序可以随便。

2.= 和in 可以乱序:a = 1 and b = 2 and c = 3mysql的查询优化器会做优化成索引可以识别的形式。

3.尽量选择区分度高的列作为索引:标准是 count(distinct col) / count(*),也就是在(0,1]之间浮动,值越高区分度越大,主键的区分度就是1,。一般需要join的字段最好是在0.1以上(没有明确规定)。

4.索引列不能参与计算

5.尽量扩展索引而不是新建

以上是一些主要原则,还有一些细要原则就不列了,都是一些经验之谈。

Mysql索引的认知:

认知主要的是对于最左原则的理解和测试

假设现在存在联合索引(age,name,address)与表user中,例子来源于上一篇博客3.3处。

以下会走索引:

1.select * from user where age = 7 and name = '刘' and address = '北京';

毫无疑问,这一句就是根据索引写出来的,肯定走索引。

2.select * from user where  name = '刘' and address = '北京' and age = 7;

查询优化器会优化成 age = 7 and name = '刘' and address = '北京',所以满足要求,同样走索引。

3.select * from user where age = 7;

索引也是生效的,因为从结构中可以看见索引第一个字段就是年龄,所以能一下子定位到相应数据。

4.select * from user where age = 7 and address='北京';

索引也是生效的,先通过age定位到7的数据,然后查询出全部名字的人,最后查询出地址是北京的。也就是这种情况其实是部分扫描了,姓名并没有执行索引,地址执行了索引。

以下不会走索引:

1.select * from user where  name = '刘' and address = '北京';

可以看见这么查询的话,根据结构来看第一字段是年龄,但是查询语句中没有年龄,所以不会走索引。

2.select * from user where  address = '北京';

同样的,这一句也是如此。

总结:

可以看见所谓的最左原则的出现就是根据底层B+树的结构出现的,因为在这个B+树中,辅助索引的字段就是年龄,而年龄刚好就是我们定义的联合索引的最左字段(age,name,address),所以就有了为什么要遵循最左原则了。那么通俗的将就是对于索引结构(a,b,c)来说,它的索引应用应该是(a),(a,b)(a,b,c),对于这三种查询都是有效的。

测试用例:

t_user(id,age,name,sid) 113万多数据。

建立普通索引 index (age)

ALTER  TABLE  t_user  ADD  INDEX index_age_1 (age);
测试一、

1. 查询条件为 * 号的 范围查询(<,>,!=),搜索结果很多的情况下(1056625[搜索记录]/1135271[总记录])

结果看见当查询条件是 * 时,> 并没有走索引,而是进行的全表扫描。

2.查询条件为 * 号的 范围查询(<,>,!=),搜索结果很少的情况下(3603[搜索记录]/1135271[总记录])

 

发现此时走了索引,原因很可能是搜索结果很少的缘故。

3. 查询条件缩短到 age字段时 的范围查询 (1098247[搜索记录]/1135271[总记录])

 

结果看见走了索引查询。它竟然走了索引。

根据用例一的小总结:

1.范围搜索(<,>,!=)受制于搜索结果,如果搜索结果占比很小的话,此时会走索引,如果占比过大,那么会放弃索引,走全表扫描。

2.但是根据1和3的结果,大家的搜索结果占比很大,为什么3走了索引呢,因为3的查询项只有一个age,此时的age又是索引。这就是上一篇博客里说的覆盖索引(很特别),一般的索引结构只是在叶子节点中存放了data域,此时还需要通过主键索引去进行一次定位,但是覆盖索引由于你查询的值刚好就在其中,所以不需要再走一次主键查询,因此会直接执行索引。

关于这个的观点的佐证,来源于Mysql技术内幕(InnoDB存储引擎),截图如下:

测试二、

between and的测试

这里就忽略掉了,因为情况和<,>差不多,查询数据量不大时或者查询项里面存在age子弹还是会使用到索引,但是超过一定的阈值就会全表扫描。

测试三、(最左原则)

建立联合索引(age,name,sid)

ALTER  TABLE  t_user  ADD  INDEX index_age_2 (age,name,sid);
3.1正常测试,是走索引的。

3.2 打乱顺序执行,还是会走,所以顺序是浮云

3.3出现非索引字段时,但是最左字段age是存在时,走索引。

3.4 没有最左字段age时

3.5 最左索引时使用order by子句,而排序字段是第二个索引字段时(需要和3.6进行比较)

3.6最左索引时使用order by子句,而排序字段是第三个索引字段时(需要和3.5进行比较)

3.5 和3.6 的差别就在最后的filesort操作,这其实是age是排序好的,紧接着的name的值mysql也帮我们排序好了,接着name的sid字段也是排序好的,依次而来是没有问题的,但是如果你跨间距了,就比如说age之后使用sid排序,但是age和sid之间没有顺序的特性,所以要进行filesort操作(出现filesort是比较差的场景)。

测试四、(对于like的索引使用)

建立name的单独索引,其实本例中,name的区分度是1,因为当初建立的时候是循环递增的,但是模拟一下没什么关系。

ALTER  TABLE  t_user  ADD  INDEX index_age_4 (name);
4.1 测试 name 的等于查询,可以看见使用了索引,而且ref指标是常数,性能很不错。


4.2 测试name 的like查询,给定一个指定值,type是range,性能也不错。

 

4.3测试name的like 左边匹配。可以看见性能很差,没有走索引,估计是被优化了,存储引擎认为走全盘扫描更合适。

 

4.4 测试name的like,右边匹配。此时走了索引,其实也可以根据B+树结构来分析,前面的值其实是B+树内的索引结构,所以引擎认为此时走比较合适。更快一些。

 


---------------------
作者:刘二郎
来源:CSDN
原文:https://blog.csdn.net/qq_32924343/article/details/80208929
版权声明:本文为博主原创文章,转载请附上博文链接!

分享到:
评论

相关推荐

    mysql 索引与执行计划

    ### MySQL 索引与执行计划 #### 一、索引与执行计划 ##### 1.1 索引入门 在深入探讨之前,我们首先需要理解什么是索引以及其重要性。 ###### 1.1.1 索引是什么 索引(Index)在MySQL中是一种帮助数据库高效获取...

    MySQL 索引最佳实践

    ### MySQL索引最佳实践 #### 理解索引的重要性 在数据库管理中,索引是一种数据结构,用于提高查询速度。它对于开发者和数据库管理员(DBA)来说至关重要。索引选择不当可能会导致生产环境中的诸多问题。尽管索引...

    04-VIP-Mysql索引优化实战一.pdf

    MySQL索引优化是数据库性能提升的关键环节,本篇主要探讨了几个关于MySQL索引使用和优化的重要知识点。 首先,创建了一个名为`employees`的员工记录表,其中包含`id`(主键)、`name`、`age`、`position`和`hire_...

    MySQL索引类型大汇总

    MySQL 索引类型大汇总 MySQL 索引类型是数据库性能优化的关键所在。索引可以大幅度提高查询速度,提高数据库的高效运行。在 MySQL 中,索引可以分为单列索引和组合索引两种。 1. 普通索引 普通索引是最基本的索引...

    MySQL索引最佳实践

    ### MySQL索引最佳实践 #### 一、理解MySQL索引的重要性 索引是数据库性能优化中最常用也是最重要的手段之一。合理的索引设计可以显著提高查询效率,减少服务器资源的消耗。在MySQL中,索引的选择与配置对于开发...

    MySQL索引优化课件

    MySQL索引优化是数据库性能提升的关键技术之一,尤其在处理大量数据时,高效索引能够显著加快查询速度,降低服务器负载。本课件主要聚焦于MySQL数据库的索引原理、优化策略以及相关存储过程和触发器的应用。 首先,...

    MySQL索引分析和优化.pdf

    ### MySQL索引分析和优化 #### 一、索引的重要性及原理 索引在数据库管理中扮演着极其重要的角色,特别是在提高数据检索速度方面。**MySQL索引**本质上是用来加快数据检索过程的一种数据结构,类似于书籍中的目录...

    mysql索引和锁机制ppt介绍

    ### MySQL索引和锁机制详解 #### 一、索引基础 **索引定义:** 索引是MySQL中用于提高查询效率的一种数据结构。通过索引可以在数据表中快速定位到所需的数据行,大大减少不必要的全表扫描。 **索引的重要性:** 1....

    MySQL索引 使用笔记

    【MySQL索引 使用笔记】 MySQL数据库是世界上最流行的开源关系型数据库管理系统之一,其高效的数据查询能力在很大程度上依赖于索引。本笔记将深入探讨MySQL中的索引使用,旨在帮助你提升数据库性能。 1. 索引的...

    由浅入深探究mysql索引结构原理、性能分析与优化

    由浅入深探究mysql索引结构原理、性能分析与优化

    mysql索引与视图的实例附答案宣贯.pdf

    mysql索引与视图实例附答案宣贯 在本篇文章中,我们将探讨 MySQL 中的索引和视图这两个重要概念,并通过实例和答案来宣贯相关知识点。 索引概念: 索引是一种数据结构,它可以提高查询的速度。索引可以创建在表上...

    MySQL索引背后的数据结构及算法原理

    ### MySQL索引背后的数据结构及算法原理 #### 数据结构及算法基础 索引在数据库中的作用至关重要,它能够显著提高数据检索的速度。正如标题所提到的,“MySQL索引背后的数据结构及算法原理”这一主题是技术面试中...

    Mysql索引数据结构.pptx

    MySQL 索引数据结构是数据库管理系统中提升查询效率的关键技术。当我们在处理查询速度较慢的 SQL 语句时,通常会考虑引入索引来优化。索引是一种特殊的数据结构,它按照一定的排序规则存储了数据表中的部分或全部...

    MySQL索引原理及慢查询优化1

    MySQL索引原理及慢查询优化是数据库管理中的重要主题,尤其是在高并发、大数据量的互联网环境中,优化查询性能对于系统的整体效能至关重要。MySQL作为广泛使用的开源关系型数据库,其索引机制和查询优化技巧是开发者...

    MySQL索引分析和优化[定义].pdf

    MySQL索引是数据库管理系统中用于加速数据检索的关键组件。它们的工作原理类似于书籍的索引,允许数据库系统快速定位和访问所需的数据,而无需遍历整个表。MySQL支持多种类型的索引,包括普通索引、唯一性索引和主键...

Global site tag (gtag.js) - Google Analytics