创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
对于低性能的SQL语句的定位,最有效的方法就是使用执行计划,MySQL提供了explain命令来查看语句的执行计划。我们知道,不管是哪种数据库,或者是哪种数据库引擎,在对一条SQL语句进行执行的过程中都会做很多相关的优化,对于查询语句,最重要的优化方式就是使用索引。 而执行计划,就是显示数据库引擎对于SQL语句的执行的详细情况,其中包含了是否使用索引,使用什么索引,使用的索引的相关信息等。
文章图片
explain分析结果说明:
- select_type:每个子查询的查询类型
- table:查询的数据表
- type:访问类型(非常重要,可以看出有没有走索引),有以下几个值:
属性值 | 含义 |
---|---|
all | 扫描全表数据 |
index | 遍历索引 |
range | 索引范围查找 |
index_subquery | 在子查询中使用ref |
unique_subquery | 在子查询中使用 eq_ref |
ref_or_null | 对Null进行索引的优化的 ref |
fulltext | 使用全文索引 |
ref | 使用非唯一索引查找数据 |
eq_ref | 在join查询中使用PRIMARY KEYorUNIQUE NOT NULL索引关联 |
- possible_keys:可能使用的索引,注意不一定会使用。查询涉及到的字段上若存在索引,则该索引将被列出来。当该列为 NULL时就要考虑当前的SQL是否需要优化了。
- key:显示MySQL在查询中实际使用的索引,若没有使用索引,显示为NULL。
- key_length:索引长度
- ref:表示上述表的连接匹配条件,即哪些列或常量被用于查找索引列上的值 rows 返回估算的结果集数目,并不是一个准确的值。
至少要达到 range 级别。
【mysql|explain定位及优化慢sql&explain分析结果详细说明】
推荐阅读
- mysql|mysql 连表查询 好处,MySQL 多次单表查询和多表联合查询的优缺点分析-Fun言
- 永远学不会的Java|JDBC炼气篇-1
- idea|IDEA 配置可视化数据库视图
- java开发|Idea连接mysql时区错误问题永久解决
- 技术分享|使用 SpringBoot + Redis + Vue3 + ArcoPro 开发管理系统
- 中间件|基于SpringBoot+MyBatis+Vue的音乐网站
- 后端|MySQL 灵魂 16 问,你能撑到第几问()
- Elasticsearch|Elasticsearch(通过 JDBC 使用 SQL 来查询索引 - DBeaver)
- 数据库|为什么要分库分表?