专栏名称: DBAplus社群
围绕数据库、大数据、PaaS云,顶级大咖、技术干货,运营几个月受众过十万!成为运维圈最专注围绕“数据”的学习交流和专业社群!欢迎投稿,加入探讨。
目录
相关文章推荐
AustinDatabases  ·  哎,马上删,马上 ·  2 天前  
终码一生  ·  如何加快 SQL 查询速度的同时保持 ... ·  2 天前  
51好读  ›  专栏  ›  DBAplus社群

老板:谁再搞出这类SQL慢查询事故,直接走人!

DBAplus社群  · 公众号  · 数据库  · 2020-11-09 07:15

正文

请到「今天看啥」查看全文




重启数据库后即持久化开启慢查询,查询验证如下:



mysql> show variables like '%_query_%';

+------------------------------+-----------------------------------+

| Variable_name                | Value                             |

+------------------------------+-----------------------------------+

| have_query_cache             | YES                               |

| long_query_time              | 1.000000                          |

| slow_query_log               | ON                                |

| slow_query_log_file          | /var/lib/mysql/localhost-slow.log |

+------------------------------+-----------------------------------+

6 rows in set (0.01 sec)


慢查询日志介绍



如上图,是执行时间超过 1 秒的 SQL 语句(测试):


  • 第一行:记录时间;

  • 第二行:用户名 、用户的 IP 信息、线程 ID 号;

  • 第三行:执行花费的时间【单位:秒】、执行获得锁的时间、获得的结果行数、扫描的数据行数;

  • 第四行:这 SQL 执行的时间戳;

  • 第五行:具体的 SQL 语句。


Explain 分析慢查询 SQL


分析 MySQL 慢查询日志,利用 Explain 关键字可以模拟优化器执行 SQL 查询语句,来分析 SQL 慢查询语句。


下面我们的测试表是一张 137w 数据的 app 信息表,我们来举例分析一下。


SQL 示例如下:



-- 1.185s

SELECT * from vio_basic_domain_info where app_name like '%翻译%' ;


这是一条普通的模糊查询语句,查询耗时:1.185s,查到了 148 条数据。


我们用 Explain 分析结果如下表,根据表信息可知:该 SQL 没有用到字段 app_name 上的索引,查询类型是全表扫描,扫描行数 137w。



mysql> EXPLAIN SELECT * from vio_basic_domain_info where app_name like '%翻译%' ;

+----+-------------+-----------------------+------------+------+---------------+------+---------+------+---------+----------+-------------+

| id | select_type | table                 | partitions | type | possible_keys | key  | key_len | ref  | rows    | filtered | Extra       |

+----+-------------+-----------------------+------------+------+---------------+------+---------+------+---------+----------+-------------+

|  1 | SIMPLE      | vio_basic_domain_info | NULL       | ALL  | NULL          | NULL | NULL    | NULL | 1377809 |    11.11 | Using where |

+----+-------------+-----------------------+------------+------+---------------+------+---------+------+---------+----------+-------------+

1 row in set, 1 warning (0.00 sec)


当这条 SQL 使用到索引时,SQL 如下:查询耗时:0.156s,查到 141 条数据:



-- 0.156s

SELECT * from vio_basic_domain_info where app_name like '翻译%' ;


Explain 分析结果如下表;根据表信息可知:该 SQL 用到了 idx_app_name 索引,查询类型是索引范围查询,扫描行数 141 行。


由于查询的列不全在索引中(select *),因此回表了一次,取了其他列的数据。



mysql> EXPLAIN SELECT * from vio_basic_domain_info where app_name like '翻译%' ;

+----+-------------+-----------------------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+

| id | select_type | table                 | partitions | type  | possible_keys | key          | key_len | ref  | rows | filtered | Extra                 |

+----+-------------+-----------------------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+

|  1 | SIMPLE      | vio_basic_domain_info | NULL       | range | idx_app_name  | idx_app_name | 515     | NULL |  141 |   100.00 | Using index condition |

+----+-------------+-----------------------+------------+-------+---------------+--------------+---------+------+------+----------+-----------------------+

1 row in set, 1 warning (0.00 sec)


当这条 SQL 使用到覆盖索引时,SQL 如下:查询耗时:0.091s,查到 141 条数据。



-- 0.091s

SELECT app_name from vio_basic_domain_info where app_name like '翻译%' ;


Explain 分析结果如下表;根据表信息可知:和上面的 SQL 一样使用到了索引,由于查询列就包含在索引列中,又省去了 0.06s 的回表时间。



mysql> EXPLAIN SELECT app_name from vio_basic_domain_info where app_name like '翻译%' ;

+----+-------------+-----------------------+------------+-------+---------------+--------------+---------+------+------+----------+--------------------------+

| id | select_type | table                 | partitions | type  | possible_keys | key          | key_len | ref  | rows | filtered | Extra                    |

+----+-------------+-----------------------+------------+-------+---------------+--------------+---------+------+------+ ----------+--------------------------+

|  1 | SIMPLE      | vio_basic_domain_info | NULL       | range | idx_app_name  | idx_app_name | 515     | NULL |  141 |   100.00 | Using where; Using index |







请到「今天看啥」查看全文