mysql基础(十二)索引及SQL优化(下)
2026/9/9 12:13:42 网站建设 项目流程

文章目录

    • 索引失效及优化:
      • 模糊查询失效:
      • or连接失效:
      • 违反最左前缀失效:
      • 联合索引范围查询后的索引失效:
      • 索引参与运算(包括函数)索引失效:
      • 字符串不加单引号索引失效:
      • 辨识度过低不走索引:
      • 索引尽量使用覆盖查询:
      • 查看索引使用情况:
      • 导入文件优化:
      • SQL语句优化:
      • order by优化:
      • FileSort优化:
      • group by优化(针对老版本):
      • 子查询优化:
      • or优化:
      • limit优化:
    • 索引提示:
    • 索引失效及优化总结

索引失效及优化:




以下提到的索引失效不是绝对的,严谨点来说应该是可能导致无法进行高效索引范围定位,或使优化器最终选择全表扫描。

模糊查询失效:


or连接失效:


上图OR 两边的列各自有索引,优化器使用 Index Merge 来合并两个索引的扫描结果。

违反最左前缀失效:






联合索引范围查询后的索引失效:


索引参与运算(包括函数)索引失效:




注意:MySQL 8.0.13+ 中,可以创建函数索引来专门优化这类查询

字符串不加单引号索引失效:

辨识度过低不走索引:












索引尽量使用覆盖查询:





查看索引使用情况:


导入文件优化:









SQL语句优化:

INSERT优化
原始方式

insertintotable_namevalues(a,b);insertintotable_namevalues(c,d);

优化方式:

insertintotable_namevalues(a,b),(c,d);

插入时手动开启事务并按顺序插入。

order by优化:














FileSort优化:

早期 MySQL 的 Filesort 主要有两种实现思路:

  1. 两次扫描算法:MySQL 4.1 之前主要采用这种方式。先读取排序字段和能够定位原数据行的信息进行排序,排序完成后再根据行位置读取查询所需的其他字段,因此可能需要两次访问数据,内存占用较小,但随机 I/O 较多。
  2. 一次扫描算法:MySQL 4.1 开始引入改进后的排序方式,将排序字段和查询所需的其他字段一次性读入 Sort Buffer,排序完成后可以直接返回结果,减少再次读取数据的开销,但会占用更多排序内存。
    旧版本 MySQL 中,max_length_for_sort_data曾用于影响 Filesort 对这两种方式的选择,但从MySQL 8.0.20开始,该参数已经被废弃并且不再产生作用,因此在 MySQL 8 中不应再通过调大max_length_for_sort_data来优化排序。

在现代 MySQL 8 中,优化 Filesort 更应该优先考虑:

  • 尽量利用索引完成ORDER BY,避免额外排序;
  • 减少不必要的查询字段和需要参与排序的数据量;
  • 根据实际排序情况合理设置sort_buffer_size,而不是简单地全局调大

group by优化(针对老版本):

在MySQL 8.0之前,GROUP BY 默认会按分组字段排序,MySQL 8.0开始已经取消 GROUP BY 的隐式排序。同样也可以用索引来提高效率。
下图mysql5版本

下图mysql5版本






子查询优化:




or优化:




limit优化:





索引提示:






索引失效及优化总结

1.or有一侧非索引会失效,可用Union代替。
2.模糊查询%号前置不走索引,可以覆盖解决。
3.违反最左前缀失效
4.索引字段参与运算失效
5.字符不加单引号会失效
6.IN(not in)、is(is not)匹配辨识度低的值会失效,可以用强制索引解决。
7.一个以上的二级索引参与分组索引失效。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询