mysql慢查询优化

一、慢查询日志

-- 是否记录查询日志
show variables like 'slow_query_log';
-- 是否记录未使用索引的查询
show variables like 'log_queries_not_using_indexes';
-- 开启
set GLOBAL log_queries_not_using_indexes=on;
-- 查询时间
show variables like 'long_query_time';
-- 超过0.1秒的查询记录
set GLOBAL long_query_time=0.1;
-- 开启
set GLOBAL slow_query_log=on;
-- 查看日志位置
show variables like 'slow_query_log_file';

SELECT * from t_activity LIMIT 11;

-- 慢查询格式
# Time: 210219 14:18:50
-- 执行sql主机信息
# User@Host: root[root] @ WIN-DV0VLS73PNK [192.168.1.175]
-- sql执行信息
# Query_time: 0.000000  Lock_time: 0.000000 Rows_sent: 6  Rows_examined: 6
-- 执行时间
SET timestamp=1613715530;
-- 内容
SELECT * from t_activity LIMIT 11;

二、日志分析

三、sql分析

使用explain查询sql的执行计划

EXPLAIN SELECT * from t_activity;
           id: 1
  select_type: SIMPLE
        table: t_activity   
         type: ALL      
possible_keys: NULL      
          key: NULL      
      key_len: NULL      
          ref: NULL      
         rows: 6      

 

const 常数查找,一般主键唯一索引;

eq_reg 范围查找,主键或唯一索引范围查找;

ref 连接的查找,基于某一个索引的查找;

range 基于索引的范围查找;

index 索引的扫描;

all 表扫描;

四、优化

  1、max()优化

SELECT MAX(create_time) from t_activity;
-- 创建索引
CREATE INDEX idx_create_time on t_activity(create_time);

  2、count()优化

count(*) 会包含空,count(id)不包含空。也就是  count 一个可为空的字段时,只记录不为 null 的总合。

select 
COUNT(CHAPTER_STATE != '300225') ,
COUNT(CHAPTER_STATE in ('300221','300224','300226')) 
from t_course_chapter_info;

  3、子查询优化

通常情况下,需要把子查询优化为join查询,但是优化是要注意是否是一对多的关系,注意重复数据。

  4、limit 优化

    1)、使用有索引的列或者主键进行order by 操作

    2)、记录上次返回的主键,在下次查询是使用

四、索引优化

  如何选择合适的列建立索引:

  1.在where从句,group by 从句,order by 从句,on 从句中出现的列

  2.索引字段越小越好

  3.离散度大的列放到联合索引的前面 ,count(字段)越高离散度越大。

原文地址:https://www.cnblogs.com/zmjc/p/14416561.html