mysql系列(五) mysql索引详细解析及使用

1. 什么是索引:

mysql索引:BTree索引,一种树形结构,索引速度比全表查询快

一个叶子节点(mysql的一个叶)默认每页16K大小

InnoDB使用B+Tree,B+Tree中每个叶子节点都有一个指向下一个叶子节点的指针

2. 聚簇索引

聚簇索引是一种数据存储方式,因为是存储引擎实现,因此不是所有存储引擎都支持聚簇索引(不同的存储引擎会使用不同的索引)

聚簇索引:(主键都有一个主键索引,就是一个索引树)叶子节点存储是主键和列的数据,以主键为索引列,叶子存储了主键和列的数据

主键索引:按照主键的顺序把列聚集在一起

在mysqlInnoDB下 聚簇索引改变了数据结构,只有一个树结构的

如果没有主键:选择一个唯一非空索引列(这个也没有,会隐式的创建)一张表只有一个聚簇索引,其他都是二级索引;二级索引保存的是(主键列的值);在根节点上(二分查找)在哪加载到内存,找到叶子节点在加载。。。直到找到对应的数据(树大了IO次数会多【磁盘寻到】,数据库的瓶颈出现)

列的宽度决定了索引树的大小,

索引树的大小每个叶存储多少数值,

每个叶存储多少数值决定了检索的速度

InnoDB中默认最大填充因子是叶的15/16大小  16K数据  数据达到15K的时候, 分配到下一页。 不同页之间可能不是顺序的,只是通过一个指针相连。

叶的饱和度会影响索引树的大小

2.2组合索引

匹配最左前缀

全值匹配

匹配列前缀

匹配范围值

索引列的顺序非常重要(使用的顺序,建立索引的先后顺序).

3. 非聚簇索引

MyISAM引擎:聚簇索引与非聚簇索引的数据分布有区别,以及对应的主键索引和二级索引的数据分布也有区别。

索引存储的是行的指针

4. hash index(Hash索引)

 哈希索引(Hash Index)基于哈希表实现,只有精确匹配索引所有列的查询才有效。对于每一行数据, 存储引擎都会对所有的索引列计算一个哈希码(HashCode),哈希码是一个较小的值。哈希索引将哈希 码存储在索引中,同时在哈希表中保存指向每个数据行的指针

 因为哈希索引自身只需存储对应的哈希值,所以索引的结构十分紧凑,这也让哈希索引查找的速度非 常快。然而哈希索引也有它的限制:

  1. 哈希索引只包含哈希值和行指针,而不存储字段值,所以不能使用索引中的值来避免读取行;
  2. 哈希索引数据并不是按照索引值顺序存储的,所以也就无法用于排序 ;
  3. 哈希索引不支持部分索引列匹配查找 Ø 哈希索引只支持等值比较,包括=、in()、<=>,也不支持任何范围查询 ;
  4. 访问哈希索引的数据非常快,除非有很多哈希冲突 ;
  5. 如果哈希冲突很多的话,一些索引维护操作(索引重建)的代价也会很高;

5. 全文索引(分词 elserch)

索引的字段要尽量小,因为BTree索引树高度页的大小以及页里面的数据大小决定的。数据越小,磁盘块存储的数据越多,树的高度越低,查询性能越高

使用索引带来的问题:

1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加

2、索引也需要占空间,我们知道数据表中的数据也会有最大上线设置的,如果我们有大量的索引,索引文件可能会比数据文件更快达到上线值

3、当对表中的数据进行增加、删除、修改时,索引也需要动态的维护,降低了数据的维护速度。

发布了55 篇原创文章 · 获赞 3 · 访问量 5239

猜你喜欢

转载自blog.csdn.net/qq_38130094/article/details/103553971