Mysql的索引详解

1.索引的分类

1.按照功能来分,可以分为主键索引、唯一索引、普通索引、全文索引

2.按照索引字段个数来分,可以分为单列索引、联合索引

3.按照物理实现方式来分,可以聚簇索引、非聚簇索引

2.适合添加索引的场景

1.具有唯一性约束的字段。

2.频繁地作为where查询条件的字段,包括select/update/delete。

3.需要gruop by 或 order by的字段

4.distinct字段需要添加索引(实测在数据量小的情况下意义不大)

5.多表连接join时需要注意的事项:连接表的张数最好不要超过3张,对where条件的字段增加索引,对于两表之间的关联字段,被关联表的该字段需要有索引且字段在两表中的属性保持一致。

6.区分度高的字段适合作为索引,反之则不适合。举例:性别字段就两种类型,这种区分度就很低,不适合作为索引。我们常用的xxId,一般来说这种id都是唯一的,每个人的id都不一样,这种区分度就是100%,非常适合作为索引。

3.慢sql分析

可以开启慢sql日志,然后分析慢sql日志中的慢sql。

在my.cnf中开启慢sql日志:

long_query_time=1; //设置慢查询的标准是1S,超过1S就是慢查询。

slow_query_log=ON; //设置开启慢查询日志记录

4.profile分析

对于慢查询sql,可以使用profile工具进行分析,确定SQL主要耗时是在什么步骤。

show profiles; //查询最近的一些sql

show profile for query 704; //展示我们需要查询的sql的详细耗时情况

可以看到上述sql耗时主要在executing步骤,也就是执行阶段。这种时候就需要explain一下sql,查看具体的执行计划进行分析。

5.explain分析

可以看到上述sql走了name索引,Using index表示是走了覆盖索引,但是还是耗时很长,最主要的原因就是扫描的行太多了,也就是rows字段,多达9307475行,就是数据量太大导致的耗时长。

5.1 explain关键字分析

相关推荐
dinglu1030DL4 分钟前
Go语言怎么格式化时间_Go语言time.Format教程【详解】
jvm·数据库·python
老码观察7 分钟前
K8s集群断电后MySQL恢复实录:从InnoDB崩溃到数据完整迁移
mysql·adb·kubernetes
敖正炀7 分钟前
MySQL 架构全景与特性总览
mysql
环流_8 分钟前
Redis单线程但效率高且快
数据库·redis·缓存
m0_624578598 分钟前
SQL数据分析如何剔除极端异常值_配合窗口函数检测偏离度
jvm·数据库·python
tkevinjd10 分钟前
MySQL1:分层架构
数据库·mysql·缓存
贫民窟的勇敢爷们15 分钟前
SpringBoot整合MyBatis-Plus极致实战,高效实现数据库CRUD与分页条件查询
数据库·spring boot·mybatis
2401_8800714015 分钟前
Redis怎样查询集群的整体健康状态_使用cluster info指令查看槽位覆盖率与节点状态
jvm·数据库·python
2301_8159019717 分钟前
Go语言如何写负载均衡器_Go语言负载均衡器实战教程【完整】
jvm·数据库·python
Mahir0821 分钟前
Redis 三大缓存问题:穿透、击穿、雪崩的原理与完整解决方案
数据库·redis·缓存·面试·大厂面试题