mysql 索引(待补充)

发布时间 2023-10-10 22:17:36作者: 凡人半睁眼

一、索引

1、什么是索引

  在关系数据库中,索引是一种数据结构他将数据提前按照一定的规则进行排序和组织, 能够帮助快速定位到数据记录的数据,

加快数据库表中数据的查找和访问速度。像书籍的目录、文件夹、标签 、房号.... 都可以帮助我们快速定位,都可以视为索引。

能实现快速定位数据的一种存储结构,其设计思想是以空间换时间。

2、索引的种类

在MySQL中索引是在存储引擎层实现的,而不是在服务器层实现的,所以不同存储引擎具有不同的索引类型和实现。常见的索引分类如下:

● 按数据结构分类:B+tree索引、Hash索引、Full-text索引。

● 按物理存储分类:聚集索引、非聚集索引。

● 按字段特性分类:主键索引(PRIMARY KEY)、唯一索引(UNIQUE)、普通索引(INDEX)、全文索引(FULLTEXT)。

● 按字段个数分类:单列索引、联合索引(也叫复合索引、组合索引)。

3、常见索引的数据结构和区别

二叉树

红黑树

B 树

B+ 树

区别:树的高度影响获取数据的性能(每一个树节点都是一次磁盘I/O)

二叉树:

特点:每个节点最多有两个子节点, 大在右,小在左 ,数据随机性情况下树杈越明显。

如果数据是按顺序依次进入:
树的高度则会很高(就是一个链表结构), 此时元素的查找效率就等于链表查询O(n),数据检索效率将极为低下。

极端的情况下 就是一个链表结构(如下图),此时元素的查找效率就等于链表查询O(n)。

红黑树(平衡二叉树) 

虽通过自旋平衡,子节点会自动分叉为2个分支,从而减少树的高度,当数据有序插入时比二叉树数据检索性能更佳.
但是如果 数据量过大,节点个数就越多,树高度也会增高(也就是树的深度越深),增加磁盘I/O次数,影响查询效率。

B-树

 

 

9、硬删除索引失效

硬删除(也称为物理删除)指的是直接从数据库表中删除数据行,硬删除操作可能导致数据库索引失效的原因通常包括以下几点:

1. 索引不再反映实际数据:

当你从表中硬删除数据时,索引中的数据不再反映实际表中的数据。这可能导致索引的统计信息不准确,从而影响查询优化器的决策,导致查询性能下降。

2. 索引分裂:

硬删除可能导致索引分裂(Index Split),即当一个索引页上的数据被删除时,可能会导致该页变得很空,而其他页可能变得很满。这样的分布可能导致索引的平衡性下降,影响查询性能。

3. 碎片化:

硬删除操作可能导致数据文件的碎片化,这会使得磁盘上的数据分布不连续,从而影响磁盘 I/O 性能。

4. 不再利用索引覆盖查询:

当一个表的数据经常被硬删除时,原本可以利用索引覆盖查询的查询可能不再有效,因为索引中的数据已经不再与实际数据匹配,这会导致查询需要回表(即从磁盘中读取数据行),增加了查询的开销。

5. 表和索引的统计信息不准确:

数据库系统通常会根据表中的数据分布和索引的使用情况来维护统计信息,以便于查询优化。硬删除可能导致这些统计信息不准确,从而影响查询计划的生成。

如何解决和避免索引失效:

  • 定期重建索引: 定期对表的索引进行重建操作可以帮助恢复索引的性能。MySQL 提供了 OPTIMIZE TABLE 命令用于重建表,可以帮助清理碎片,提高性能。
  • 使用软删除而非硬删除: 考虑使用软删除(添加一个标志位来标识数据是否被删除)而非硬删除,这样可以保持数据的完整性,同时避免硬删除导致的问题。

  • 定期收缩表空间: 如果使用的是 InnoDB 存储引擎,可以考虑定期使用 OPTIMIZE TABLE  table_name来收缩表空间,减少碎片。

  • 合理设计数据库模型: 合理的数据库设计和索引设计可以减少硬删除操作的频率,从而减轻硬删除带来的影响。

  • 避免频繁的删除操作: 尽量避免频繁的硬删除操作,考虑使用定期的数据归档和清理策略。

 

 

https://www.yuque.com/tulingzhouyu/sfx8p0/qnxql079alg2ghhz?singleDoc=