首页 > 数据库 >mysql 索引(待补充)

mysql 索引(待补充)

时间:2023-10-10 22:22:05浏览次数:45  
标签:导致 删除 补充 查询 链表 索引 mysql 数据

一、索引

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=

标签:导致,删除,补充,查询,链表,索引,mysql,数据
From: https://www.cnblogs.com/dgp-zjz/p/17747542.html

相关文章

  • docker入门加实战—从部署MySQL入门docker
    docker入门加实战—从部署MySQL入门dockerdocker部署MySQL输入如下命令:dockerrun-d\--namemysql\-p3306:3306\-eTZ=Asia/Shanghai\-eMYSQL_ROOT_PASSWORD=123\mysql部署成功截图如下:当执行命令后,Docker做的第一件事情,是去自动搜索并下载了MySQL,......
  • sql server主键索引
     添加ALTERTABLE表名ADDCONSTRAINTPK_XXXPRIMARYKEYNONCLUSTERED(字段)go唯一,非聚集索引ALTERTABLE表名ADDCONSTRAINTPK_XXXPRIMARYKEYCLUSTERED(字段)go唯一,聚集索引  删除ALTERTABLE表名DROPCONSTRAINTPK_XXXgo ......
  • MySql事务以及隔离级别
    MySql事务什么是事务?即为一段代码块在执行过程中同时结束并不报错,要么同时成功,要么同时失败为什么需要事务?为了考虑数据的安全性,比如转账时,付款和收款要同时成功事务怎么使用?--声明事务starttransaction;sql1,sql2,.....commit;--提交事务--如果上述代......
  • MySQL基础命令
    一)基础命令1)对数据库的操作1.使用use库名;2.创建createdatabase库名;3.删除dropdatabase库名;4.显示数据库,表showdatabases;showtables;2)对数据表的操作1.创建表createtable表名(字段字段类型,idint,namevarchar(32));2.删除表droptable表名;3.修改表名altertable......
  • MySQL业务用户无法修改的会话级别参数
    对于MySQL的系统参数,有些参数只能在全局级别(global)修改,有些参数能在全局和会话(session)级别修改。对于能在会话级别修改的参数,应用用户也可以在当前会话中修改需要的参数来实现不同的业务需求。比如sql_mode参数,如果不同的应用可以根据不同的需求在各自的session中进行修改。此外,......
  • MySQL 低版本 解决row_number()over()无法使用的方法
    MySQL8以上版本支持了很多的窗口函数,但是低版本的可能也需要用到row_number()over()selecta.u_name,a.class,a.score,if((@class=null)or(@class=a.class),@rownum:=@rownum+1,@rownum:=1)rn,#没有并列情况if((@class=......
  • MySQL存储过程、递归调用
    MySQL存储过程、递归调用实现字典数据的预处理,维护类别表、数据表、tree表,数据库在jwzh_manager库1、先将excel导入到system_dict表,按表字段注释对应匹配。2、编写存储过程处理数据CREATEDEFINER=`root`@`%`PROCEDURE`handle_system_dict`()BEGIN #Routinebodygoesher......
  • 9月《中国数据库行业分析报告》已发布,47页干货带你详览 MySQL 崛起之路!
    为了帮助大家及时了解中国数据库行业发展现状、梳理当前数据库市场环境和产品生态等情况,从2022年4月起,墨天轮社区行业分析研究团队出品将持续每月为大家推出最新《中国数据库行业分析报告》,持续传播数据技术知识、努力促进技术创新与行业生态发展,目前已更至第十七期,并发布了共计1......
  • MySQL进阶篇:第三章_SQL性能分析
    MySQL进阶篇:第三章_SQL性能分析SQL执行频率MySQL客户端连接成功后,通过show[session|global]status命令可以提供服务器状态信息。通过如下指令,可以查看当前数据库的INSERT、UPDATE、DELETE、SELECT的访问频次:--session是查看当前会话;--global是查询全局数据;SHOW......
  • 定时备份mysql脚本
    定时备份mysql指定数据库脚本,保留60天#!/bin/bash#pathcd/opt/pmo/mysql_datatarget_directory="/opt/pmo/mysql_data"#gettimenowcurrent_time=$(date+%s)#cal22monthsagobefore_time=$(date-d"60daysago"+%s)file_name=metersphere_`date+......