当前位置: 首页 > news >正文

SQL索引及调优

一:索引的含义及用法
● 索引index:一种特殊的查找结构,它存储了表中特定列的值,并对这些值进行排序,同时保存了指向原表行数据的物理地址指针。
● 先查索引,通过索引查表,提高查询效率。
● 优点:加快select的速度
● 缺点:增加了insert,delete,update等操作的开销,因为每次数据变动都要同时更新索引结构
● 索引是B+数的数据结构,可以和表值一起储存,也可以分开储存

二:索引的种类
按物理结构分类(MySQL InnoDB引擎)
● 聚集索引:索引结构和数据行存储在一起。一个表只能有一个。数据的物理存储顺序与索引逻辑顺序一致,查询速度极快,但对插入有要求。
● 非聚集索引(二级索引):索引结构和数据行分开存储。一个表可以有多个。索引的叶子节点存储的不是行数据,而是主键值(用于回表)。
按功能逻辑分类:
● 主键索引:
● 唯一索引:
● 普通索引:
● 复合索引:(最左前缀原则:索引顺序很重要,不按顺序来,就会索引失效)

索引的创建和删除的语法:
● -- 1. 创建普通索引:CREATE INDEX index_name ON table_name (column1, column2, ...);
● -- 2. 创建唯一索引:CREATE UNIQUE INDEX index_name ON table_name (column);
● -- 3. 创建复合索引(注意列的顺序):CREATE INDEX idx_col1_col2 ON table_name (column1, column2);
● -- 4. 删除索引:DROP INDEX index_name ON table_name;
● -- 5. 查看表的索引:SHOW INDEX FROM table_name;

三: 怎么判断索引失效?
1,用EXPLAIN看SQL的执行过程,判断索引是否有效,是否扫了全表,
2,在SQL语句前加一个 EXPLAIN 关键字
3,看什么字段:关键输出字段:
● type (连接类型): 越接近左边的性能越好。const > eq_ref > ref > range > index > ALL (最差,全表扫描)
● key (使用的索引): 显示实际使用的索引名称。
● rows (扫描行数): 估计需要扫描多少行数据才能得出结果,数值越小越好。
● Extra (额外信息): 重要的提示,如出现 Using filesort (文件排序) 或 Using temporary (使用临时表) 通常表明可以进一步优化。

四:索引失效的原因?主要是这5种情况
1,对索引字段进行了计算或者加了函数
2,对索引模糊查询 %放在最前面
3,or 条件查询中,有条件不是索引
4,用了!=在所有语句中
5,存在隐式类型转换

五:如何调优?
基本步骤:
1,首先要找到哪个SQL语句是慢查询。Identify,
1.1 用慢查询日志来看,记录执行时间超过某个阈值的SQL语句
1.2 用数据库自带的性能分析工具来做(MySQL的Performance Schema)来查询消耗资源最多的查询,
2,用EPLAIN来分析为什么慢。Analyze
2.1 EXPLAIN:是全表扫还是用了索引,用了什么接连方式,预计读了多少行数据
3,优化和重构Optimize
3.1 根据分析结果,对于SQL语句或者低层结构进行优化
4,测试与验证Verify
4.1 重新运行EXPLAIN
4.2 确认实际运行时间

六:常用的方法

  1. 索引优化 (最常见且有效)
    ● 检查索引覆盖: 确保查询中的 WHERE, ORDER BY, GROUP BY 子句都用到了索引。
    ● 遵循最左前缀原则: 检查复合索引的使用顺序是否符合 column1, column2, column3 的顺序。
    ● 避免索引失效: 确保没有对索引列使用函数、进行计算或使用负向查询(如 NOT LIKE, !=)。
  2. SQL 语句重构
    ● 使用 LIMIT 限制结果集: 在测试或分页查询中,避免返回不必要的大量数据。
    ● 避免 SELECT *: 只选择需要的列,减少网络传输和数据库处理的开销。
    ● 优化 JOIN 类型: 根据需求选择最合适的连接(INNER, LEFT, RIGHT),避免不必要的全连接。
    ● 优化子查询: 尽量将关联子查询(Dependent Subquery)改写为 JOIN 或使用 EXISTS 替代 IN(在大表中)。
    ● 使用 UNION ALL 代替 UNION: 如果确定结果集中没有重复项,使用 UNION ALL 可以避免耗时的去重操作。
  3. 数据结构和模型优化
    ● 数据类型优化: 使用最精确且最小的数据类型。例如,用 DATE 代替 DATETIME(如果不需要时间),用 INT 代替 VARCHAR 存储数字。
    ● 垂直分区 (Vertical Partitioning): 将大表中不经常访问的列或大文本字段拆分到另一个表中,减少主表的 I/O 负担。
  4. 数据库环境和配置优化
    ● 统计信息更新: 确保数据库的统计信息(Statistics)是最新的。优化器依赖这些信息来选择最佳执行计划。
    ● 缓冲池配置: 确保数据库的内存缓存(Buffer Pool)足够大,以便将常用的数据和索引块保留在内存中,减少磁盘 I/O。
http://www.jsqmd.com/news/26801/

相关文章:

  • Python列表 _ 创一个购物清单
  • 如何在Golang项目中集成Prometheus进行监控?
  • 第177天:信息收集篇自动项目本机导出外部打点域内通讯PillagerBloodHound
  • 如何在Linux中,为Flatpak版本的Edge浏览器导入证书
  • 2025年防火HPL板厂家权威推荐榜单:耐刮防火板/耐高温防火板 /阻燃高压装饰板源头厂家精选
  • Java 集合 “Map(1)”面试清单(含超通俗生活案例与深度理解) - 教程
  • 2025 年铸铁井盖生产厂家最新推荐榜,技术实力与市场口碑深度解析防沉降球墨/防沉降/电力/双层铸铁井盖公司推荐
  • 220kv数字化变电站保护解决方案综述[期刊理解]
  • 2025年10月VI设计公司权威推荐排行榜:排名依据包括项目交付质量、客户满意度、创新能力和市场影响力
  • 2025年0糖苏打水厂家权威推荐榜单:带帽苏打水/茉莉苏打水 /蜜桃苏打水源头厂家精选
  • Bilidown Setup 1.2.7下载
  • rpm因依赖安装失败的一次检查记录
  • 0296-Nand-机器语言
  • 0295-Nand-时序逻辑
  • [apt update docker 密钥问题]
  • 0300-Nand-表示代码
  • Python逻辑运算 _ 今年过节能收礼吗
  • ENGG5301 Information Theory 2025 Midterm Exam P3:Causal Encoding
  • 0291-Nand-实现基础逻辑门(一)
  • NASM下载和安装教程(附安装包)
  • 0292-Nand-实现基础逻辑门(二)
  • 单点登录SSO是怎么实现的?
  • 赋能智慧货运:视频汇聚平台EasyCVR打造货运汽车安全互联网视频监控与管理方案
  • 2025年上海房产继承律师权威推荐榜单:继承律师/离婚律师/婚姻律师事务所精选
  • 【SPIE出版、往届已EI检索】第二届遥感技术与图像处理国际学术会议(RSTIP 2025)
  • autotiny下载_v3.0.0.2
  • 2025 年井盖篦子最新推荐榜,技术实力与市场口碑深度解析铸铁套/树围/球墨铸铁单/溢流井/雨水井盖篦子公司推荐
  • Python嵌套_多条件判断 _ 对象今天会生气吗 II
  • 解析视频融合平台EasyCVR的分析平台技术如何成为“全域视频管理中台”
  • flink-连mongo db