一、索引的概述与分类
什么是索引?
MySQL官方定义:
索引是(Index)是帮助的MySQL高效获取数据的数据结构,我们可以理解为快速查找排好序的一种数据结构。
索引类似于图书的目录索引,可以提高检索的效率,降低数据库的IO成本。
索引的分类:
- 主键索引
即主索引,根据主键建立,不允许重复,不允许空值;如果表中没有定义主键,InnoDB会选择一个唯一的非空索引代替。如果没有这样的索引,InnoDB会隐式定义一个主键来作为聚簇索引。 - 唯一索引
用来建立索引时的列的值必须是唯一的,允许空值。
- 普通索引
用表中的普通列构建的索引,没有任何限制。
- 全文索引
用大文本对象的列构建的索引。 - 组合索引
用多个列表组合构建的索引,这是多个列表的值不允许有空值。
组合索引的最左原则
总结:
索引就像是一本书的目录是为了提高检索的速度。
在MySQL中有不同的索引类型,要求和效率也不一样
二、索引原理-索引与B+Tree
哈希索引
B+TREE索引
只有menory(内存) 存储引擎支持哈希索引,哈希索引用索隐裂的值计算该值的hashCode,然后在hashCode相应的位置存该值所在行数据的物理位置,因为使用散列算法,因此访问速度非常快,但是只能一个值只能对应一个hashcode,而且是散列的分布方式,因此哈希索引不支持范围查找和排序的功能。正藏情况下,如果不指定索引,那么一般是指B+Tree索引(或者B+t Tree索引)。
存储引擎以不同的方式使用B+Tree索引。性能也各有不同,但是InnoDB按照原数据格式进行存储。
B+Tree 就是B+树,而B+Tree就是通过B树演变过来的,所以想知道什么是B+树,那么就要了解什么是b树,要了解b树呢就得知道二叉树,这些都是数据结构的内容,那么数据结构是啥呢?数据结构是计算机存储。组织数据的方式。数据结构是指相互之间存在一种或者多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或存储效率。数据结构往往同更高效的检索算法和索引技术有关。
顺序查找:就是从第一个元素开始,按索引顺序遍历待查找序列,直到找出给定目标或查找失败
缺点:效率低–需要遍历整个待查序列
二分查找:也称为折半查找,是一种在有序数组中查找特定元素的搜索算法。
二叉树也存在缺点,就是当数据是顺序插入时就会改变树的形态(在非完全二叉树的时候)
平衡二叉树经过条件的控制,在通过旋转的方式,完成树的平衡,不过,旋转次数过多。
红黑树
在平衡二叉树稳定性下的基础上,在优化一下,减少旋转次数,保证树的平衡性。树的查找性能,取决于树的高度,让树尽可能平衡,就是为了降低树的高度。
当数据存在内存中,红黑树效率非常高,但是文件系统和数据库都是存在硬盘上的,如果数据量大的话,不一定能一次性加载到内存。
所以一棵树都无法一次性加载到内存,又如何谈查找。因此就出现了专为磁盘等存储设备而设计的一种平衡多路查找树,也就是B树 ,与红黑树相比,在相同的节点的情况下,一颗B/B+树的高度远远小于红黑树的高度。
B树即平衡查找树,一般理解为平衡多路查找树,也称为B-树、B_树。
B树是一种自平衡树状数据结构,一般较多用于存储系统上,比如数据库或文件系统。
1、磁盘读写代价更低
B树的数据和索引都在同一个节点上,那么每个块中包含的索引是少量的,如果想要取出比较深层的数据,意味着要读取更多的块,才能得到更多的索引和数据,那么就增加了IO次数。
而B+树每个块中存储的索引是B树的很多倍,那么获取比较深层的数据,也只需要读取少量的块就可以,那么减少了磁盘的IO次数。
2、随机IO的次数更少
随机 I/O 是指读写操作时间连续,但是访问地址不连续,时长约为10ms。
顺序 I/O 是指读取和写入操作基于逻辑块逐个连续访问来自相邻地址的数据,时长约为0.1ms
相同情况下,B树要进行更多的随机I/O,而B+树需要更多的顺序I/O,因此B+树,效率也更快。
3、查询速度稳定
由于B+Tree非叶子节点不存储数据(data),因此所有的数据都要查询至叶子节点,而叶子节点的高度是相同的,因此所有数据的查询速度是一样的。
总结:
数据库中,索引是为了提高数据的检索速度的,而索引是基于B+Tree的数据结构实现的。
而使用B+Tree的好处是:
1、降低了磁盘读写代价。
2、顺序I/O提高效率
3、查询速度更稳定。
聚簇索引 和非聚簇索引
索引分聚簇索引和非聚簇索引两种。
在索引的分类中,我们可以按照索引的主键来分为“主索引”和“辅助索引”
使用主键键值建立的索引称为“主索引”,其他的称为“辅助索引”。
因此索引只能有一个,辅助索引可以有很多个。
聚簇索引:索引即数据,数据即索引。
非聚簇索引:找到索引仅仅是找到的当前索引值和key值如果需要索引外的内容,则需要回表。
以上都以InnoDB表引擎为基础
MyISAM和InnoDB的区别
数据存储方式:
InnoDB有两种文件组成,表结构,数据和索引
MyISAM有三种文件组成,表结构、数据、索引
索引的方式:
索引的底层都是基于B+Tree的数据结构建立
InnoDB中主键索引为聚簇索引,辅助索引是非聚簇索引
事务的支持:
InnoDB支持事务
MyISAM不支持事务
三、慢查询与优化
MySQL的慢查询。全名是慢查询日志,是MySQL提供的一种日志记录,用来记录在MySQL中相应时间超过阈值的语句。默认情况下,MySQL数据库并不启动慢查询日志,需要手动来设置这个参数。如果不是调优需要的话,一般不建议启动该参数,开启慢查询日志或多或少带来一定的性能影响。
未完待续…