【MySQL】20个经典面试题
最全MySQL面试题和答案
MYSQL调优
数据库备份
SQL 优化的一般步骤
常用的SQL的优化
sql语句练习50题(Mysql版)
MySql面试题
网站首页
SQL 优化的一般步骤
#### 1. 通过show status 命令了解各SQL 的执行频率 ```sql show [session|global] status like "Com_%"; ``` - session:当前连接执行的统计结果 - global:上一次数据库启动至今的统计结果 常见的执行参数: - Com_select:执行查询的次数 - Com_insert:执行插入的次数 - Com_update:执行更新的次数 - Com_delete:执行删除的次数 - Com_rows_read:执行查询的返回行数(举一反三:inserted、updated、deleted) - Connection:试图连接Mysql 服务器的次数 - Uptime:服务器工作时间 - Slow_queries:慢查询次数 ```sql mysql> show global status like "Slow_queries"; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Slow_queries | 0 | +---------------+-------+ 1 row in set ``` #### 2. 定位执行效率最低的SQL 语句 可以通过两个办法定位效率较低的SQL 语句: - 通过慢查询日志定位执行效率低的SQL,但是只能在查询完过后 - 使用show processlist 命令查看当前Mysql 正在进行的线程,包括线程状态、是否锁表 #### 3. 通过EXPLAIN 分析低效SQL 的执行计划 查询到效率低的sql 语句后,可以通过EXPLAIN 分析低效SQL 的执行计划。 ```sql mysql> explain select * from comment ; +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | comment | NULL | ALL | NULL | NULL | NULL | NULL | 92 | 100 | NULL | +----+-------------+---------+------------+------+---------------+------+---------+------+------+----------+-------+ 1 row in set mysql> ``` - select_type: 表示select 的类型,常见取值有SIMPLE(简单表,即不使用表连接或者子查询)、PRIMARY、UNION、SUBQUERY等。 - table: 输出结果集的表 - type: 表示Mysql 的访问方式(从上到下依次变快) - type=all,全表扫描,Mysql 遍历全表来找到匹配的行 - type=index,Mysql 遍历整个索引来找到匹配的行 - type=range,索引范围扫面 - type=ref,使用非唯一索引扫描或唯一索引的前缀扫描 - type=eq_ref,使用唯一索引 - type-const/system,单表中最多只有一个匹配行 - type=NUll,MySQL 不用访问表或者索引就能直接得到结果 - possible_key: 表示查询时可能用到的索引 - key: 表示实际用到的索引 - key_len: 使用到索引字段的长度 - rows: 扫描行的数量 - Extra: 执行情况的说明和描述。 #### 4. 通过show profile 分析SQL ```sql //默认不开启profile,使用时先开启profile mysql> set profiling=1; Query OK, 0 rows affected mysql> select @@profiling; +-------------+ | @@profiling | +-------------+ | 1 | +-------------+ 1 row in set //在InnoDB 下获取表行数 mysql> select count(*) from comment; +----------+ | count(*) | +----------+ | 92 | +----------+ 1 row in set // 查开执行时间 mysql> show profiles; +----------+------------+------------------------------+ | Query_ID | Duration | Query | +----------+------------+------------------------------+ | 1 | 0.0109785 | select @@profiling | | 2 | 0.05502275 | select count(*) from comment | +----------+------------+------------------------------+ 2 rows in set //具体查开每一步执行时间 mysql> show profile for query 2 ; +----------------------+----------+ | Status | Duration | +----------------------+----------+ | starting | 9.2E-5 | | checking permissions | 9E-6 | | Opening tables | 2E-5 | | init | 1.8E-5 | | System lock | 9E-6 | | optimizing | 0.054635 | //在优化处理耗时最多 | statistics | 5.6E-5 | | preparing | 1.7E-5 | | executing | 5E-6 | | Sending data | 8E-5 | | end | 5E-6 | | query end | 1.5E-5 | | closing tables | 9E-6 | | freeing items | 3.6E-5 | | cleaning up | 1.9E-5 | +----------------------+----------+ 15 rows in set mysql> ``` 5. 还可以通过trace 分析优化器如何选择执行计划的(有兴趣可以看一下) --- 原文链接:https://blog.csdn.net/qq_36906627/article/details/86634518
上一篇:
数据库备份
下一篇:
常用的SQL的优化