【01-Mysql索引和数据结构】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 索引
    • 一、Mysql的索引
      • B-Tree
      • Hash
    • 二、存储引擎
      • 1.MyISAM引擎
      • 2.InnoDB引擎
      • 3.不同引擎的区别
      • 注意
    • 三、索引的优点
  • 数据库死锁
    • 什么是死锁?
    • 怎么解决?


前言

记录自己学习Mysql索引和数据结构的过程


索引

索引是帮助MySQL高效获取数据的排好序的数据结构,用于快速访问数据库表中的特定信息。

一、Mysql的索引

B+Tree(B-Tree变种)索引、Hash索引、空间索引、全文索引

B-Tree

B-Tree(平衡多路查找树)是MySQL中最常用的索引类型,它支持全值匹配和范围查询。在InnoDB、MyISAM、Memory等存储引擎中都可以使用。
只有3层,叶子节点存储数据,非叶子节点只存储叶子且叶子节点用指针连接,性能比较好,且可存储的数据量大,大多数都是使用B-Tree。

Hash

“=”,“IN”查询时,速度比较快,但范围查询需要反复重新遍历,不推荐使用Hash索引。

二、存储引擎

MySQL 索引使用的是 B 树中的 B+ 树,但索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。

1.MyISAM引擎

	MyISAM索引文件和数据文件是分离的(非聚集)
	MyISAM 引擎使用 B+ 树作索引结构,**叶子节点的 data 域存放的是数据记录的地址**,所有索引均是非聚集索引。

2.InnoDB引擎

	InnoDB 的数据文件本身就是索引文件,有且仅有一个聚集索引,和多个非聚集索引
	聚集索引-**叶节点包含了完整的数据记录**;
	建议InnoDB表必须自建主键,且推荐使用整形的数据结构;
	非主键索引结构为了保证和主键索引的一致性,且节省存储控件,叶子节点存储的是主键值;

3.不同引擎的区别

	MyISAM 索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。
	而在 InnoDB 中,表数据文件本身就是按 B+ 树组织的一个索引结构,这棵树的叶子节点 data 域保存了完整的数据记录。
	这个索引的 key 是数据表的主键,因此 InnoDB 表数据文件本身就是主索引。

	MyISAM 中首先按照 B+ 树搜索算法搜索索引,如果指定的 key 存在,则取出其 data 域的值,然后以 data 域的值为地址,读取相应数据记录。
	MyISAM 的索引方式也叫做非聚集索引(稀疏索引)(索引和数据是分开存储的)。
	 InnoDB的索引和数据保存在同一文件中,叫做聚集索引(密集索引)。
	 与 MyISAM 索引的不同是 InnoDB 的辅助索引 data 域存储相应记录主键的值而不是地址。
	 聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索 2 遍索引:
	首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

注意

InnoDB 索引机制中:
不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。
不建议用非单调的字段作为主键,因为 InnoDB 数据文件本身是一棵 B+ 树,
非单调的主键会造成在插入新记录时数据文件为了维持 B+ 树的特性而频繁的分裂调整,十分低效。
使用自增字段作为主键则是一个很好的选择。

三、索引的优点

索引大大减少了服务器需要扫描的数据行数。
帮助服务器避免进行排序和分组,以及避免创建临时表(B+Tree 索引是有序的,可以用于 ORDER BY 和 GROUP BY 操作。
临时表主要是在排序和分组过程中创建,不需要排序和分组,也就不需要创建临时表)。
将随机 I/O 变为顺序 I/O(B+Tree 索引是有序的,会将相邻的数据都存储在一起)。

数据库死锁

什么是死锁?

死锁是指两个或多个事务在等待对方释放资源时被阻塞的情况。

怎么解决?

1.适当降低事务的隔离级别,因为事务的隔离级别越高,锁的粒度就越大,这会增加死锁的概率。
2.减少事务并发度,从而减少死锁的发生;
3.优化SQL语句和索引,减少对同一数据行的竞争,从而降低死锁的几率;
4.使用数据库的死锁检测和超时机制。


参考链接:https://zhuanlan.zhihu.com/p/637007390
参考链接:https://blog.csdn.net/a1157334591/article/details/130622022
参考链接:https://vip.kingdee.com/article/2012?productLineId=1

#未完待续

你可能感兴趣的:(mysql,数据结构,数据库)