尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

SQL索引及调优

SQL索引及调优
📅 发布时间:2026/6/19 9:22:10

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。

相关新闻

  • 如何在Golang项目中集成Prometheus进行监控?
  • 220kv数字化变电站保护解决方案综述[期刊理解]
  • 2025年0糖苏打水厂家权威推荐榜单:带帽苏打水/茉莉苏打水 /蜜桃苏打水源头厂家精选

最新新闻

  • Gemini大模型系列技术解析与真实能力边界
  • 修复kkFileView XSS漏洞与POI文件预览兼容性问题实战
  • 弱监督学习与概率提示技术在3D目标检测中的应用
  • Hoppscotch自托管部署与API自动化测试实战指南
  • Qwen3.6-A3B:面向本地Agent的MoE实时推理引擎解析
  • 微信防撤回失效?RevokeMsgPatcher 2.0 技术原理与实战指南

日新闻

  • 5分钟掌握Python进化算法:Geatpy高性能优化工具完全指南
  • Microchip 24AA044 EEPROM选型与应用全指南:从参数解析到实战编程
  • 华为的鸿蒙到底有多牛?为什么称作遥遥领先?

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号