写点什么

Mysql 索引

作者:zdd
  • 2022 年 1 月 13 日
  • 本文字数:716 字

    阅读完需:约 2 分钟

索引

定义:索引是帮助 MySQL 高效获取数据的排好序数据结构

慢查询:查找数据需要时间长

解决:给数据表加索引

若表不加索引,表查找是逐行查找。

索引的数据结构

  • 二叉树

方便快速查找

缺点:若数据递增,则会退化成链表

  • 红黑树

一种自平衡二叉查找树

缺点:数据越多,则树的高度会越高

  • B-Tree



 

一个节点可以存储更多的数据(节点有大小限制,一般是 16K);叶子节点具有相同的深度;所有索引元素不重复且递增排列

  • B+Tree



 

非叶子节点不存储 data,只存储索引(冗余),可以放更多的索引;叶子节点包含所有索引字段;叶子节点用指针连接,提高区间访问性能;

比较:B+Tree 与 Hash 表

B+Tree 相比较于 Hash 表更好的支持范围查找。

索引的存储引擎

  • MyISAM 索引(非聚集)



索引与数据分开存放



 

表的存放目录下有三个文件



 

.frm 文件存放表结构,.MYD 文件存放表数据,.MYI 文件存放索引

执行查询先看所在列有没有索引,若有则根据索引查找数据磁盘地址,然后取出数据

  • InnoDB 索引(聚集)



索引与数据放在一起



表的存放目录下有二个文件



.frm 文件存放表结构,.ibd 文件存放索引与数据

 

聚集索引-叶子节点包含完整的数据记录;非主键索引结构的叶子节点储存的是主键值(一致性和节省存储空间);

推荐使用整型的自增主键(整型比较查找快);建表时一般会给主键建立索引,若没有主键,会自动在表中选择一列数据不重复的建立索引,若没有不重复的列,会自动新增唯一的列用来建立索引。

联合索引

ALTER TABLE table_name ADD INDEX (id,name,time);



  • 最左前缀原则当进行联合查询时,若有 id 字段,则可以走索引查询,顺序可以打乱(MySQL 的查询优化器可以优化成索引识别的形式)若没有 id 字段进行查询,走索引的效率低,因为在索引中只有 id 是严格按照有序来排的,其他字段可能是无序的。

用户头像

zdd

关注

还未添加个人签名 2021.12.13 加入

还未添加个人简介

评论

发布
暂无评论
Mysql索引