mysql索引

本文详细介绍了索引在数据库中的作用、B+树等数据结构,比较了堆表和索引组织表的区别,讨论了联合索引的使用、索引失效的原因及优化,以及MySQL优化器的选择策略。同时探讨了索引的优缺点和正确使用方法,以及何时适合或不适合使用索引。
摘要由CSDN通过智能技术生成

索引数据结构:

什么是索引?为什么索引能加快查询?

索引是能够提升查询速度的一种数据结构,相当于目录!查询数据时就根据索引来查询就行了。

因为索引在插入时对数据进行了排序,查找起来有顺序很快,所以加快查询。但是每次修改或者插入时会影响性能,毕竟每次都要对数据进行排序。

索引的数据结构是什么?

B+树。B+树不同于二叉树,每个根节点的子节点可以有很多个,并且每个子节点都存放的是数据页,非叶子节点存放的是索引,叶子节点不仅存放索引还存放具体的所有数据。

B+树和B树,红黑树有什么区别?为什么选择B+树作为索引数据结构?

首先B+树,B树和红黑树都是平衡树,平衡树就是插入数据的时候在保证了左边小右边大的情况下,一个根节点的子节点的高度差不会大于1,这样树会矮一点使得IO操作比较少。

为什么采用B+树:

一是B+树的非叶子节点只存放索引不存放具体数据,查找效率高,而且叶子节点之间使用双向链表来连接,方便范围查询。

索引存储:

堆表和索引组织表有什么区别?分别应用场景是什么?

堆表中的数据无序存放,数据的排序完全依赖与索引:

数据和索引分开存储,索引的叶子节点存放了数据的地址,当数据变化时索引叶子节点的数据也要变化,很麻烦,影响性能。

而索引组织表,数据根据主键排序存放在索引中,也就是平时说的索引:

应用场景:

堆表用于直接的增删改查比较多,而且只支持表锁并发性能较差,索引组织表支持行所,并发性能高。

联合索引

联合索引的结构是怎样的?

结构还是B+树,就是多了一个或多个键而已,多个键并行显示,一行显示一种键

比如:第一行都是姓名,第二行都是年龄。

而且联合索引是讲究顺序的

如何利用联合索引提高查询性能?

联合索引可以多个键排序,避免额外类似文件排序。

可以避免回表,也就是形成索引覆盖,提高查询性能。

索引失效

为什么会失效?失效的场景有哪些?

6种会发生索引失效的情况:

1.当使用左或者左右模糊查询的时候,也就是like %xx或者like %xx%这两种方式都会造成索引失效,因为索引是从左开始找的,这两种方式最左的都模糊掉了,所以不行会失效。

2.当我们在查询条件中对索引列使用函数,会造成索引失效,因为索引用的是一开始存放的数据,使用函数之后就成了新的数据,所以索引就会失效。

3.当我们在查询条件中对索引列进行表达式计算也会索引实失效,原因同2.

4.当mysql遇到字符串与数字进行比较的时候也会索引失效。因为字符换与数字进行比较的时候mysql会把字符串给变成数字再进行比较,这时候字符串变数字是会用到函数的,所以索引也失效。

5.联合索引如果不遵循最左匹配原则的话也会造成索引失效。

6.在where字句中,如果or前面用了索引列,or后面没用索引列也会索引失效。

索引选择

mysql的优化器是怎么执行的?根据什么选择索引?

复习一下先:

mysql数据库由server层和engine层组成:

server层有sql分析器,sql优化器,sql执行器,用于负责sql语句的具体执行过程。

engine层负责储存具体的数据,比如最常用的InnoDB存储引擎,还有用于在内存中存储临时结果集的temptable引擎。

然后,mysql的优化器是CBO(Cost-based Optimizer,基于成本的优化器)的,会选择成本最低的执行计划。一般选择这些作为索引:高选择的字段就是区分度高的字段,低选择性但是数据存在倾斜,数据倾斜可用直方图让mysql直到进行索引选择。

索引应用

建立索引有什么优点和缺点?

优点:可以提高查询效率。

缺点:占据内存空间,并且修改索引对应地数据时索引会跟着变动会影响性能

如何正确地使用索引?

1.索引要独立,就是不能用函数或者表达式计算

2.索引长度要合适,太长开销太大,可使用前缀索引来降低开销

3.尝试建立联合索引,好用

4.建立联合索引时要注意字段的顺序

5.尽量用聚簇索引,聚簇索引的叶子节点存放索引和数据。InnoDB存储引擎一般选择主键作为聚簇索引,否则选择唯一非空字段作为索引,再不行隐式定义一个主键来创建聚簇索引,这个定义的主键一般是自增的。

哪些场合适合使用索引?

1.主键

2.频繁作为查询条件的字段

3.查询中作为与其他表相关联的字段(外键)

4.排序,统计,分组字段。

5.高并发的时候倾向使用组合索引

哪些场合不适合使用索引?

1.频繁更新的字段,表

2.很少作为查询条件的字段

3.表的数据量不多,一般数据量在百万级别用索引

4.数据重复在分布平均的字段。比如年龄性别

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值