局部性:
1.空间局部性(程序和数据都有聚集成群的倾向,在一个时间段内,仅使用其中一小部分)
2.时间局部性(或者最近访问过的程序代码和数据,很快由被访问的可能性很大) IO代表磁盘的写入和写出,(1.随机读取 2.顺序读取)
索引是什么?
- 帮助Mysql 高效获取数据的数据结构
- 索引数据存储在文件系统中
- 索引的文件存储形式和存储引擎有关(InnoDB(默认的存储引擎)、MyISAM)
- 索引文件的结构(hash、二叉树(树的深度太深会影响IO的读取的次数)、B树、B+树) 建立索引的优点:
- 索引能够提高数据检索的效率,降低数据库的IO成本。
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性,创建唯一索引
- 在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
- 加速两个表之间的连接,一般是在外键上创建索引 建立索引的缺点:
- 需要占用物理空间,建立的索引越多需要的空间越大
- 创建索引和维护索引要耗费时间,这种时间随着数据量的增加而增加
B树的特点
- 所有键值分布在整棵树中
- 搜有可能在非叶子节点结束,在关键全集内做一次查找,性能逼近二分查找
- 每个节点最多拥有m个子树
- 根节点至少有两个子树
- 分支节点至少拥有m/2课子树
B+ Tree
B+树是在B树的基础上做的这一种优化,变化如下
- B+树每个节点可以包含更多的节点,这个做的原因有两个,第一个原因是为了降低数的高度,第二个原因是将数据范围变成为多个区间,区间越多,数据检索速度越快
- 非叶子节点存储key,叶节点存储key和数据
- 叶子节点两两指针互相连接(符合磁盘预读的特性),顺序性能更高
使用的B+ Tree的索引模型,那么你知道为什么采用B+ 树吗?这和Hash索引比较起来有什么优缺点吗?
- 因为Hash索引底层是哈希表,哈希表是一种以key-value存储数据的结构,所以多个数据在存储关系上是完全没有任何顺序关系的,所以,对于区间查询是无法直接通过索引查询的,就需要全表扫描。所以,哈希索引只适用于等值查询的场景。
- 而B+ Tree是一种多路平衡查询树,所以他的节点是天然有序的(左子节点小于父节点、父节点小于右子节点),所以对于范围查询的时候不需要做全表扫描
- B+ Tree索引和Hash索引区别 哈希索引适合等值查询,但是不无法进行范围查询,哈希索引没办法利用索引完成排序。哈希索引不支持多列联合索引的最左匹配规则。如果有大量重复键值得情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。
B+ Tree的叶子节点都可以存哪些东西
InnoDB的B+ Tree可能存储的是整行数据,也有可能是主键的值。
mysql 索引的分类
- 主键索引:针对于表中主键创建的索引,默认自动创建,只能有一个,primary。
- 唯一索引:避免同一个表中某数据列中的值重复,可以有多个,unique,值可以为空。当你为某个字段创建唯一约束时,会自动创建唯一索引。
- 普通索引:只可以为空,没有唯一的限制,快速定位特定数据,可以有多个。
- 全文索引:查找的是文本中的关键字,而不是比较索引中的值,可以有多个。fulltext
- 组合索引:多列值组成一个索引,专门用于组合搜索
mysql 聚簇索引和非聚簇索引
-
聚簇索引 在某些情况下可以认为是 按照主键id (或某一列)从小到大的排序 如 1.2.3.4....。 而且聚簇索引 可以理解为一
个树枝加一片叶子的结构。 树枝就是 主键id 叶子就是主键id 对应的所有数据。
-
非聚簇索引,只要不是聚簇索引的 都可以称之为非聚簇索引。 非聚簇索引存储的 树叶是 数据的内存地址,而不是实际数据。且非聚簇索引 所查询到的主键不一定是正向排序(主键作为非聚簇索引除外)。
覆盖索引
覆盖索引 覆盖索引(covering index)指一个查询语句的执行只用从索引中就能够取得,不必从数据表中读取。也可以称之为实现了索引覆盖。 当一条查询语句符合覆盖索引条件时,MySQL只需要通过索引就可以返回查询所需要的数据,这样避免了查到索引后再返回表操作,减少I/O提高效率。 如,表covering_index_sample中有一个普通索引 idx_key1_key2(key1,key2)。当我们通过SQL语句:select key2 from covering_index_sample where key1 = 'keytest';的时候,就可以通过覆盖索引查询,无需回表。
联合索引 最左匹配原则
在创建多列索引时,我们根据业务需求,where子句中使用最频繁的一列放在最左边,因为MySQL索引查询会遵循最左前缀匹配的原则,即最左优先,在检索数据时从联合索引的最左边开始匹配。所以当我们创建一个联合索引的时候,如(key1,key2,key3),相当于创建了(key1)、(key1,key2)和(key1,key2,key3)三个索引,这就是最左匹配原则。
回表
先索引扫描,再通过ID去取索引中未能提供的数据,即为回表。
索引下推
- 不使用索引条件下推优化时存储引擎通过索引检索到数据,然后返回给MySQL服务器,服务器然后判断数据是否符合条件。
- 当使用索引条件下推优化时,如果存在某些被索引的列的判断条件时,MySQL服务器将这一部分判断条件传递给存储引擎,然后由存储引擎通过判断索引是否符合MySQL服务器传递的条件,只有当索引符合条件时才会将数据检索出来返回给MySQL服务器。索引条件下推优化可以减少存储引擎查询基础表的次数,也可以减少MySQL服务器从存储引擎接收数据的次数。
主键最好设置成自增的因为方便索引的维护(减少索引的页分裂)