盘点MySQL慢查询的12个原因

来源丨捡田螺的小男孩


前言

日常开发中,我们经常会遇到数据库慢查询。那么导致数据慢查询都有哪些常见的原因呢?今天田螺哥就跟大家聊聊导致MySQL慢查询的12个常见原因,以及对应的解决方法。

1. SQL没加索引

很多时候,我们的慢查询,都是因为没有加索引。如果没有加索引的话,会导致全表扫描的。因此,应考虑在where
的条件列,建立索引,尽量避免全表扫描。

反例:

select * from user_info where name ='捡田螺的小男孩公众号' ;<br>

//添加索引<br>alter table user_info add index idx_name (name);<br>

2.10 优化器选错了索引

MySQL 中一张表是可以支持多个索引的。你写SQL
语句的时候,没有主动指定使用哪个索引的话,用哪个索引是由MySQL
来确定的。

我们日常开发中,不断地删除历史数据和新增数据的场景,有可能会导致MySQL选错索引。那么有哪些解决方案呢?

  • 使用force index
     强行选择某个索引
  • 修改你的SQl,引导它使用我们期望的索引
  • 优化你的业务逻辑
  • 优化你的索引,新建一个更合适的索引,或者删除误用的索引。

3. limit深分页问题

limit深分页问题,会导致慢查询,应该大家都司空见惯了吧。

3.1 limit深分页为什么会变慢

limit深分页为什么会导致SQL变慢呢?假设我们有表结构如下:

CREATE TABLE account (<br>  id int(11) NOT NULL AUTO_INCREMENT COMMENT '主键Id',<br>  name varchar(255) DEFAULT NULL COMMENT '账户名',<br>  balance int(11) DEFAULT NULL COMMENT '余额',<br>  create_time datetime NOT NULL COMMENT '创建时间',<br>  update_time datetime NOT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',<br>  PRIMARY KEY (id),<br>  KEY idx_name (name),<br>  KEY idx_create_time (create_time) //索引<br>) ENGINE=InnoDB AUTO_INCREMENT=1570068 DEFAULT CHARSET=utf8 ROW_FORMAT=REDUNDANT COMMENT='账户表';<br>