博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MySQL索引基础知识梳理
阅读量:2497 次
发布时间:2019-05-11

本文共 1998 字,大约阅读时间需要 6 分钟。

本文内容针对InnoDB中的索引进行说明。

为什么要使用索引?

1、使用索引能够大大减少数据量的扫描。

2、因为索引结构是有序的,因此使用索引可以使随机读取变成顺序读取。

3、索引也是InnoDB中实现行锁的必要前提。

索引的类型

主键索引、唯一索引、普通索引、组合索引、全文索引。

索引的数据结构

1、Hash(只有memory的存储引擎显式支持哈希索引)

  • 我们都知道Hash的查询时间复杂度是O(1),所以在等值查询时非常高效。
  • 但在实际使用时还有很多业务场景是按照范围查询,那么此时Hash结构就不能很好的满足需求了。
  • 同理涉及到排序时,Hash也无法完成。
  • 如果Hash冲突较多,使得链表较长,那么查询效率也很低。

2、B+Tree(默认存储结构)

B+Tree是MySQL在B-Tree的基础上进行的一种针对自身使用特点的优化,数据从非叶子节点中剥离可以大大提高非叶子节点的存储量,从而减少IO次数,当然B+Tree的内容远远不止这些,比如叶子节点通过链表的方式连接起来,索引有序等等,本文不做太多介绍,后面会专门对B+Tree进行讲解。

聚簇索引和非聚簇索引

聚簇索引不是一种索引的类型,而是一种数据存储的方式,聚簇索引指的就是将数据行存放在叶子节点中,非聚簇索引指的是将数据和索引分开存储,索引的叶子节点只存放对应数据行的地址。

Innodb使用的就是聚簇索引的方式,而MyISAM选择的是非聚簇索引的方式。

在这里插入图片描述

区别

  • 聚簇索引的叶节点就是数据节点,而非聚簇索引的叶节点仍然是索引节点,并保留一个链接指向对应数据块。
  • 聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。
  • 相比之下,聚簇索引适合排序,非聚簇索引不适合用在排序的场合。因为聚簇索引叶节点本身就是索引和数据按相同顺序放置在一起,索引序即是数据序,数据序即是索引序,所以很快。非聚簇索引叶节点是保留了一个指向数据的指针,索引本身当然是排序的,但是数据并未排序,数据查询的时候需要消耗额外更多的I/O,所以较慢。

覆盖索引

什么是覆盖索引

如果要索引中包含了所有要查询列的值,那么这次索引查询就称为覆盖索引。

覆盖索引的好处

在Innodb中,覆盖索引结合聚簇索引能够有效的减少数据检索量,并避免回表的产生

索引使用小细节

1、哪些列上建立索引?

一般我们会建议在经常被查询的列上建立索引,但也需要注意如果该列更新比较频繁或者区分度不高(比如只有一个状态0/1的标识),那么就需要考虑是否值得建立索引了。

在更新比较频繁的列上建立索引,会降低更新时的效率,因为每次更新都需要对索引的存储进行维护。

2、使用主键索引

主键查询不会触发回表查询。

3、索引覆盖

注意使用覆盖索引,也可以避免回表查询。

4、建立唯一索引

对唯一属性的列上建立唯一索引,可以更快的检索数据。

5、注意隐式转换

如果phone建立的是varchar类型

select * from user where phone=13800000000; 不走索引

select * from user where phone=‘13800000000’; 走索引

6、单表建立索引的数量

单表建立的索引数量建议控制在3-5个,建立太多的索引会占用过多的空间,同时也会造成插入、更新变慢,降低数据库的整体性能。

7、单列索引还是组合索引

如果单列和组合索引都可以实现的情况下,建议使用组合索引,因为一个单列索引就会建立一个b+tree的存储结构,太多单列索引会占用过多的空间。

使用组合索引时需要注意最左匹配原则,避免索引失效,区分度高的列放在最左边,组合数量不宜过多。

8、索引的列为null

建立索引的列最好设置不允许为null,否则有些查询可能不会走索引。

9、多表join

多表join的字段应当使用索引,并且必须要保持字段类型一致。

10、避免函数、计算

不要在索引列上进行函数或者计算操作,否则会导致索引失效

select * from table where c+1 = 2; c列有索引,也不会走索引查询

select * from table where c = 1; c列会走索引

11、范围、排序

排序字段上可以建立索引。

组合索引中,范围查询时范围后面的列无法用到索引。

12、索引的长度

有时候我们并不需要把列中的所有值都作为索引列来存储,可以通过计算索引列的区分度,来控制索引的长度,减少索引占用的空间,使得一次IO能够读取更多的索引列到内存中,提高索引的查询效率。

13、like查询

select * from table where name like ‘%zz%’

左右都有%的查询,是不会走索引的。

select * from table where name like ‘zz%’

左边没有%的情况下,会走范围类型的索引。

转载地址:http://ymlrb.baihongyu.com/

你可能感兴趣的文章
期货市场技术分析07_摆动指数和相反意见理论
查看>>
满屏的指标?删了吧,手把手教你裸 K 交易!
查看>>
不吹不黑 | 聊聊为什么要用99%精度的数据回测
查看>>
对于模拟交易所引发的思考
查看>>
高频交易的几种策略
查看>>
量化策略回测TRIXKDJ
查看>>
量化策略回测唐安奇通道
查看>>
CTA策略如何过滤部分震荡行情?
查看>>
量化策略回测DualThrust
查看>>
量化策略回测BoolC
查看>>
量化策略回测DCCV2
查看>>
mongodb查询优化
查看>>
五步git操作搞定Github中fork的项目与原作者同步
查看>>
git 删除远程分支
查看>>
删远端分支报错remote refs do not exist或git: refusing to delete the current branch解决方法
查看>>
python multiprocessing遇到Can’t pickle instancemethod问题
查看>>
APP真机测试及发布
查看>>
通知机制 (Notifications)
查看>>
10 Things You Need To Know About Cocoa Auto Layout
查看>>
一个异步网络请求的坑:关于NSURLConnection和NSRunLoopCommonModes
查看>>