Loading... #### 索引的本质 - 索引是帮助MySQL高效获取数据的排好序的数据结构,MySQL采用的是B+树来存储索引 - 常见的索引数据结构 - 二叉树 - 红黑树 - Hash表 - B-Tree > 数据结构可视化,可以在 [Data Structure Visualization (usfca.edu)](https://www.cs.usfca.edu/~galles/visualization/Algorithms.html) 这个网站上练习 ![image.png](https://qiniu.program-er.com/blog/typecho/usr/uploads/image.png) #### 索引的原理 索引是用来快速地寻找那些特定值的记录。如果没有索引,一般来说执行查询时会遍历整张表 原理:就是把无序的数据变成有序的查询 1. 把创建了索引的列的内容进行排序 2. 对排序结果生成倒排表 3. 在倒排表内容上拼上数据地址链 4. 在查询的时候,先拿到倒排表内容,再取出数据地址链,从而拿到具体数据 #### B树和B+树的区别 B树的特点: 1. 节点排序 2. 一个节点可以存多个元素,多个元素也排序了 B+树的特点: 1. 拥有B树的特点 2. 叶子节点用指针连接,提高区间访问性能 3. 非叶子节点上不存储data,只存储索引(冗余),也就是叶子节点中存储了所有的元素,并且排好顺序。 Mysql索引使用的是B+树,因为索引是用来加快查询的,而B+树通过对数据进行排序所以是可以提高查询速度的,然后通过一个节点中可以存储多个元素,从而使得B+树的高度不会太高,在Mysql中一个Innodb页就是一个B+树节点,一个Innodb页默认是16kb,所以一般情况下一颗两层的B+树可以存2000万行左右的数据,然后通过利用B+树叶子节点存储了所有数据并且进行了排序,并且叶子节点之间有指针,可以很好的支持全表扫描、范围查找等SQL语句。 #### InnoDB索引实现(聚集) - 表数据文件本身就是按B+ Tree组织的一个索引结构文件 - 聚集索引(也叫聚簇索引)-叶子节点包含了完整的数据记录 - 为什么建议InnoDB表必须建主键 > InnoDB采用B+树作为存储结构,那么必然需要一个列作为key,什么是key?一个B+树的节点可以存储key、地址、行数据(仅叶子节点),key 就是不重复的值且可以比较(确保树进行分裂时,可以确定是左孩子还是右孩子)。我们知道主键的特定就是主键的值不可重复,也不可为空,正好符合B+树key的要求 - 为什么推荐使用整型的自增主键 > 聚簇索引的数据的物理存放顺序与索引顺序是一致的,即:只要索引是相邻的,那么对应的数据一定也是相邻地存放在磁盘上的。聚簇索引的顺序和磁盘中数据的存储顺序是一致的,如果主键不是自增id,那么可以想 象,它会干些什么,不断地调整数据的物理地址、分页,当然也有其他一些措施来减少这些操作,但却无法彻底避免。但,如果是自增的,那就简单了,它只需要一 页一页地写,索引结构相对紧凑,磁盘碎片少,效率也高。 > 数据索引在存储过程中就已经在排序了,使用整型比较大小更快,而字符串类型的索引(比如uuid)比较时,效率低一些 - 为什么非主键索引结构叶子节点存储的是主键值? > 一致性和节省存储空间 #### MySQL慢查询该如何优化 - 检查是否走了索引,如果没有,则优化SQL利用索引 - 检查所利用的索引,是否是最优索引 - 检查所有字段是否都是必须的,是否查询了过度字段,查出了多余数据 - 检查表中数据是否过多,是否应该进行分库分表 - 检查数据库实例所在机器的性能配置,是否需要适当增加资源 #### MySQL锁有哪些,如何理解 按锁粒度分类: 行锁:锁某行数据,锁粒度最小,并发度高 表锁:锁整张表,锁粒度大,并发度低 间隙锁:锁的是一个区间 还可以分为: 共享锁:也就是读锁,一个事务给某行数据加了读锁,其他事务也可以读,但是不能写 排它锁:也就是写锁,一个事务给某行数据加了写锁,其他事务可以读,但是不能加读锁,也不能写 还可以分为: 乐观锁:并不会真正的锁某行记录,而是通过某个版本号来实现 悲观锁:上面的行锁、表锁都是悲观锁 > 在事务的隔离实现中,就需要利用锁来解决幻读 最后修改:2023 年 08 月 22 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 0 感谢赏赐的coffee~