Mysql 索引
索引
定义:索引是帮助 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 是严格按照有序来排的,其他字段可能是无序的。
评论