MySQL索引优化总结

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: 本文主要对常见索引失效的情况进行总结,并提出相关优化建议;另外,还介绍查询优化分析方法和思路,以及OrderBy关键字排序优化和group by分组优化方法和优化策略
  1. 索引失效总结(复合索引)
  • 单表查询时,保证where查询条件的顺序和个数与索引建立的顺序和个数要保持一致
  • 最佳左前缀法则,即where的查询条件要从索引的列的最左列开始并且不跳过索引中的列
  • 不在索引列上做任何操作(计算、函数、(自动or手动)类型转换),会导致索引失效而转向全表扫描。
  • 存储引擎不能使用索引中范围条件右边的列,即where 范围查询条件后面的索引列失效
  • 尽量使用覆盖索引(只访问索引的查询(索引列和查询列一致)),减少select*查询
  • 查询条件中使用is null,is not null也无法使用索引
  • like以通配符开头('%abc.... ')mysql索引失效会变成全表扫描的操作,只有写在最右边才会避免查询失效;2. 在生产过程中,必须要写两边百分号

对于 like 两边百分号的原因,比较推荐的方法是使用覆盖索引

  • 字符串不加单引号索引失效
  • 少用or,用它来连接时会索引失效
  • mysql在使用不等于(!=或者<>)的时候无法使用索引,会导致全表扫描


  1. 一般性建议
  • 对于单键索引,尽量选择针对当前query过滤性更好的索引
  • 在选择组合索引的时候,当前Query中过滤性最好的字段在索引字段顺序中,位置越靠前越好。
  • 在选择组合索引的时候,尽量选择可以能够包含当前query中的where字句中更多字段的索引
  • 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的
  • 使用索引可加快数据检索速度,但为每个列都建立索引没有必要。因为索引自身也需要维护,并占用一定的资源,可以按照以下标准选择建立索引的列
  • 频繁搜索、查询选择的列
  • 经常排序、分组的列
  • 经常用于连接的列(主键、外键)

在MySQL可以通过查询当前会话的last_query_cost的值来得到其计算当前查询的成本


  1. 索引优化总结
  • 单列索引还是多列索引?

由于mysql只能用到你所有建立的索引中的唯一一个最优索引,所以如果建立多个单列索引,其实效率并不会高(虽然  mysql5.x以上的版本,会在查询时,做索引合并的优化,但仍不建议这么做)

  • 索引可以优化查询,那么索引真的越多越好吗?

由于mysql的索引是表的数据的一部分,就像你手中的汉语词典一样,目录越庞大,可读性越差(查询性能越差)。而且,在insert,update,delete时,都要额外维护索引的成本,建立过多的索引可能意味着更差的写性能。

  • 如何优化查询?
  • 尽可能的让查询走索引,查询条件尽量避免出现 or  
  • 范围查询, col like '%xxx%'模糊查询,会导致范围|模糊查询 之后的条件索引失效
  • 子查询使用关联查询替代
  • 关联查询,用小表驱动大表
  • 学会使用limit,limit会让你的查询提前返回需要的行,这点在排序的时候尤其有用(避免全部排序,只排序需要的列)
  • 在多租户的系统里,千万别漏掉tenant_id这个辨识度最高的列(tenant_id建议放在最左边)


  1. 查询优化分析
  • 观察,至少跑1天,看看生产的慢SQL情况。
  • 开启慢查询日志,设置阈值,比如超过5秒钟的就是慢SQL,并将它抓取出来。
  • explain+慢SQL分析

Explain能够告诉你这个查询在数据库中是一个什么样的执行计划来实现的。首先我们需要有个目标,通过不断调整尝试,再借助Explain来验证结果是否满足自己的需求,直到得到预期的结果。

  • show profile分析

MySQL的Explain执行计划可以用来对Sql语句进行分析,是否进行全表扫描,是否用了索引,或者是sql语句先后执行计划,有没有用临时表等等,由此来进行Sql优化,而show Profile和Explain一样都是用来查看Sql语句分析的,但是形式不一样,show Profile用来分析当前会话语句执行的资源消耗情况,能清晰的知道sql执行过程,以及过程中消耗的时间。

  • 进行SQL数据库服务器的参数调优。


  1. 查询优化原则
  • 小表驱动大表,即小的数据集驱动大的数据集


  1. 查询优化思路
  • 优化更需要优化的查询
  • 定位优化对象的性能瓶颈
  • 明确优化的目标
  • 从Explain入手
  • 多使用 profile
  • 永远用小结果集驱动大结果集
  • 尽可能在索引中完成排序
  • 只取出自己需要的字段(Columns)
  • 仅仅使用最有效的过滤条件
  • 尽可能避免复杂的join


  1. OrderBy关键字排序优化

order by 子句,尽量使用index方式排序,避免使用file sort方式排序,尽可能在索引列上完成排序操作,遵照索引键的最佳左前缀法则。


会产生index方式排序:

  • 排序字段使用索引列:ORDER BY 语句使用索引最左前列
  • 使用Where子句与Order By子句条件列组合满足索引最左前列;


排序字段不在索引列:mysql就要启动双路排序和单路排序

优化策略:

  • 增大sort_buffer_size参数的设置
  • 增大max_length_for_sort_data参数的设置


提高 Order By的速度:

  • Order by时 select*是一个大忌只 Query需要的字段,这点非常重要。在这里的影响是:
  • 当 Query的字段大小总和小于max_length_for_sort_data而且排序字段不是TEXT|BLOB类型时,会用改进后的算法——单路排序,否则用老算法一一多路排序。
  • 两种算法的数据都有可能超出 sort buffer的容量,超出之后,会创建tmp文件进行合并排序,导致多次O,但是用单路排序算法的风险会更大一些所以要提高sort_buffer_size。
  • 尝试提高 sort_buffer_ size

不管用哪种算法,提髙这个参数都会提高效率,当然,要根据系统的能力去提高,因为这个参数是针对每个进程的

  • 尝试提高max_length_for_sort_data

提高这个参数,会增加用改进算法的概率。但是如果设的太高,数据总容量超出 sort_buffer_size的概率就增大,明显症状是高的磁盘ⅣO活动和低的处理器使用率


  1. group By关键字排序优化
  • 应遵循索引键的最佳左前缀法则
  • 当无法使用索引列,增大max_length_for_sort_data参数的设置 和增大sort_buffer_ size参数的设置
  • where 高于having ,能写在where限定的条件就不要去having中限定了



相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3天前
|
SQL 关系型数据库 MySQL
深入解析MySQL的EXPLAIN:指标详解与索引优化
MySQL 中的 `EXPLAIN` 语句用于分析和优化 SQL 查询,帮助你了解查询优化器的执行计划。本文详细介绍了 `EXPLAIN` 输出的各项指标,如 `id`、`select_type`、`table`、`type`、`key` 等,并提供了如何利用这些指标优化索引结构和 SQL 语句的具体方法。通过实战案例,展示了如何通过创建合适索引和调整查询语句来提升查询性能。
38 9
|
1月前
|
缓存 关系型数据库 MySQL
MySQL索引策略与查询性能调优实战
在实际应用中,需要根据具体的业务需求和查询模式,综合运用索引策略和查询性能调优方法,不断地测试和优化,以提高MySQL数据库的查询性能。
|
1月前
|
SQL 关系型数据库 MySQL
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
MySQL慢查询优化、索引优化,是必知必备,大厂面试高频,本文深入详解,建议收藏。关注【mikechen的互联网架构】,10年+BAT架构经验分享。
大厂面试官:聊下 MySQL 慢查询优化、索引优化?
|
8天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
47 18
|
6天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化以及慢查询优化
通过本文的介绍,希望您能够深入理解MySQL索引优化和慢查询优化的方法,并在实际应用中灵活运用这些技术,提升数据库的整体性能。
17 7
|
6天前
|
缓存 关系型数据库 MySQL
MySQL 索引优化与慢查询优化:原理与实践
通过本文的介绍,希望您能够深入理解MySQL索引优化与慢查询优化的原理和实践方法,并在实际项目中灵活运用这些技术,提升数据库的整体性能。
26 5
|
9天前
|
存储 关系型数据库 MySQL
Mysql索引:深入理解InnoDb聚集索引与MyisAm非聚集索引
通过本文的介绍,希望您能深入理解InnoDB聚集索引与MyISAM非聚集索引的概念、结构和应用场景,从而在实际工作中灵活运用这些知识,优化数据库性能。
57 7
|
1月前
|
SQL 关系型数据库 MySQL
MySQL慢查询优化、索引优化、以及表等优化详解
本文详细介绍了MySQL优化方案,包括索引优化、SQL慢查询优化和数据库表优化,帮助提升数据库性能。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
MySQL慢查询优化、索引优化、以及表等优化详解
|
25天前
|
关系型数据库 MySQL Java
MySQL索引优化与Java应用实践
【11月更文挑战第25天】在大数据量和高并发的业务场景下,MySQL数据库的索引优化是提升查询性能的关键。本文将深入探讨MySQL索引的多种类型、优化策略及其在Java应用中的实践,通过历史背景、业务场景、底层原理的介绍,并结合Java示例代码,帮助Java架构师更好地理解并应用这些技术。
25 2
|
1月前
|
缓存 监控 关系型数据库
如何优化MySQL查询速度?
如何优化MySQL查询速度?【10月更文挑战第31天】
80 3
下一篇
DataWorks