MySQL优化之索引(二)

MySQL优化之索引(二)

索引是什么:索引是从数据中提取具有标示性的关键字,并且有到对应数据的映射关系,MySQL索引的建立对于MySQL的高效运行是很重要的,索引可以大大提高MySQL的检索速度。

一、索引类型
1、主键索引 PRIMARY KEY 唯一且不能为空
2、普通索引 KEY 符合索引的仅按照第一字段有序
3、唯一索引 UNIQUE KEY 要求关键字唯一
4、全文索引 FULLTEXT KEY 可以在char、varchar或text类型的列上创建
5、复合索引 最左原则

二、索引管理语法
1、查看索引
show index from tablename;
2、建立索引
(1.)ALTER TABLE table_name ADD INDEX index_name (column_list)
(2.)ALTER TABLE table_name ADD UNIQUE (column_list)
(3.)ALTER TABLE table_name ADD PRIMARY KEY (column_list)
其中table_name是要增加索引的表名,column_list指出对哪些列进行索引,多列时各列之间用逗号分隔。索引名index_name可选,缺省时,MySQL将根据第一个索引列赋一个名称。另外,ALTER TABLE允许在单个语句中更改多个表,因此可以在同时创建多个索引。
3、删除索引
ALTER TABLE table_name DROP INDEX index_name
如果删除的是主键索引,并且主键自增长,需要alter modify 先取消自增再删除
4、SQL分析
expliain 的作用
表的读取顺序,数据读取操作的操作类型,哪些索引可以使用,哪些索引被实际使用,表之间的引用,每张表有多少行被优化器查询

三、索引的使用场景
1、where
查找字段都建立了索引,则会出现索引覆盖
2、order by
如果排序字段建立了索引,而索引又是有序排列,直接根据索引拿对应的数据即可,与读取查询出来的所有数据再排序相比效率要高
3、join
join on 条件的字段建立的索引,查找会变得高效
4、索引覆盖
直接对索引做查找,而不去读取数据

四、语法细节
1、where id +1 =? 可以写成 where id = ?-1,保证了索引字段的独立出现
2、like 语句 不要在关键字前模糊匹配,‘%字段’ 这样不会使用索引,‘字段%’这样才会使用
3、or 关键两边条件字段都建立索引时才会使用索引,只要有一边不是就会做全文扫描
4、状态值一般可以不使用索引,比如性别等

五、索引的存储结构
btree:
在这里插入图片描述
在B-Tree中按key检索数据的算法非常直观:首先从根节点进行二分查找,如果找到则返回对应节点的data,否则对相应区间的指针指向的节点递归进行查找,直到找到节点或找到null指针,前者查找成功,后者查找失败。每个域的大小都相同。

b+tree:
在这里插入图片描述
在B+Tree中key检索数据算法如同目录:首先从根节点进行二分查找,从左(小)边到右(大)匹配,找到key匹配成功的索引值,根据索引值对应的节点地址,进入节点地址key继续进行匹配,直到进入叶节点,再根据key获取数据。

在B+Tree的每个叶子节点增加一个指向相邻叶子节点的指针,就形成了带有顺序访问指针的B+Tree。做这个优化的目的是为了提高区间访问的性能

注意:每个索引的最小值,也就是子索引的最小值,依次类推,最后的子索引的最小值,也就是该数据页的key索引的最小值。最小值都是靠最左边排列。都是节点开始的第一个值。

Guess you like

Origin blog.csdn.net/SKY_PLA/article/details/100924341