本文汇总了PolarDB-X支持的SQL调优类语句。
- SHOW [FULL] SLOW [WHERE expr] [limit expr] 语句
- SHOW [FULL] PHYSICAL_SLOW [WHERE expr] [limit expr] 语句
- CLEAR SLOW 语句
- EXPLAIN SQL 语句
- EXPLAIN DETAIL SQL 语句
- EXPLAIN EXECUTE SQL 语句
- TRACE SQL 和 SHOW TRACE 语句
- CHECK TABLE tablename 语句
- SHOW TABLE STATUS 语句
1. SHOW [FULL] SLOW [WHERE expr] [limit expr]
执行时间超过 1 秒的 SQL 语句是慢 SQL,逻辑慢 SQL 是指应用发送到 PolarDB-X 的慢 SQL。关于如何排查慢SQL,详情请参见排查慢SQL。
SHOW SLOW: 查看自 PolarDB-X 启动或者上次执行CLEAR SLOW以来最慢的 100 条逻辑慢 SQL(注意,这里记录的是最慢的 100 个,缓存在 PolarDB-X 系统中,当实例重启或者执行CLEAR SLOW时会丢失);SHOW FULL SLOW: 查看实例启动以来记录的所有逻辑慢 SQL(持久化到 PolarDB-X 的内置数据库中)。该记录数有一个上限(具体数值跟购买的实例规格相关),PolarDB-X 会滚动删除比较老的慢 SQL 语句。实例的规格如果是 4C4G 的话,最多记录 10000 条慢 SQL 语句(包括逻辑慢 SQL 和物理慢 SQL);实例的规格如果是 8C8G 的话,最多记录 20000 条慢 SQL 语句(包括逻辑慢 SQL 和物理慢 SQL),其它规格依此类推。
重要列详解:
- HOST:来源 IP;
- START_TIME:执行开始时间;
- EXECUTE_TIME:执行时间;
- AFFECT_ROW:对于 DML 语句是影响行数;对于查询语句是返回的记录数。
mysql> show slow where execute_time >1000 limit 1;+-----------+---------------------+--------------+------------+-----------+| HOST | START_TIME | EXECUTE_TIME | AFFECT_ROW | SQL |+-----------+---------------------+--------------+------------+-----------+|127.0.0.1|2016-03-1613:02:57| 2785| 7| show rule |+-----------+---------------------+--------------+------------+-----------+1 row inset(0.02 sec)
2. SHOW [FULL] PHYSICAL_SLOW [WHERE expr] [limit expr]
执行时间超过1秒的 SQL 语句是慢 SQL,物理慢 SQL 是指 PolarDB-X 发送到 RDS 的慢 SQL。关于如何排查慢SQL,详情请参见排查慢SQL。
SHOW PHYSICAL_SLOW: 查看自 PolarDB-X 启动或者上次执行CLEAR SLOW以来最慢的 100 条物理慢 SQL(注意,这里记录的是最慢的 100 个,缓存在 PolarDB-X 系统中,当实例重启或者执行CLEAR SLOW时会丢失);SHOW FULL PHYSICAL_SLOW: 查看实例启动以来记录的所有物理慢 SQL(持久化到 PolarDB-X 的内置数据库中)。该记录数有一个上限(具体数值跟购买的实例规格相关),PolarDB-X 会滚动删除比较老的慢 SQL 语句。实例的规格如果是 4C4G 的话,最多记录 10000 条慢 SQL 语句(包括逻辑慢 SQL 和物理慢 SQL);实例的规格如果是 8C8G 的话,最多记录 20000 条慢 SQL 语句(包括逻辑慢 SQL 和物理慢 SQL),其它规格依此类推。
重要列详解:
- GROUP_NAME:数据库分组;
- START_TIME:执行开始时间;
- EXECUTE_TIME:执行时间;
- AFFECT_ROW:对于 DML 语句是影响行数;对于查询语句是返回的记录数。
mysql> show physical_slow;+----------------+-----------------------------------+---------------------+--------------+------------------+-------------------------+------------------------+------------+-----------------+| GROUP_NAME | DBKEY_NAME | START_TIME | EXECUTE_TIME | SQL_EXECUTE_TIME | GETLOCK_CONNECTION_TIME | CREATE_CONNECTION_TIME | AFFECT_ROW | SQL |+----------------+-----------------------------------+---------------------+--------------+------------------+-------------------------+------------------------+------------+-----------------+| TDDL5_00_GROUP | db218249098_sqa_zmf_tddl5_00_3309 |2016-03-1613:05:38| 1057| 1011| 0| 0| 1|select sleep(1)|+----------------+-----------------------------------+---------------------+--------------+------------------+-------------------------+------------------------+------------+-----------------+1 row inset(0.01 sec)
3. CLEAR SLOW
清空自PolarDB-X启动或者上次执行CLEAR SLOW以来最慢的100条逻辑慢SQL和最慢的100条物理慢 SQL。
SHOW SLOW和SHOW PHYSICAL_SLOW展示的是最慢的100个SQL,如果长时间未执行CLEAR SLOW,可能都是非常老的SQL了。一般执行过SQL优化之后,建议都执行下CLEAR SLOW,等待系统运行一段时间,再查看慢SQL的优化效果。
mysql> clear slow;Query OK,0 rows affected (0.00 sec)
4. EXPLAIN SQL
查看指定 SQL 在 PolarDB-X 层面的执行计划,注意这条 SQL 不会实际执行。关于该指令的更多案例,详情请参见SQL优化基本概念、SQL优化方法。
示例:
查看select * from doctest这条 SQL 的执行计划(doctest 这张表是按照ID列进行分库的)。从执行计划可以看出该 SQL 会下推到每个分库,然后将执行结果聚合。
mysql> explain select*from doctest;+------------------------------------------------+--------------------------------------+--------+| GROUP_NAME | SQL | PARAMS |+------------------------------------------------+--------------------------------------+--------+| DOCTEST_1488704345426RCUPDOCTEST_CAET_0000_RDS |select`doctest`.`id`from`doctest`|{} || DOCTEST_1488704345426RCUPDOCTEST_CAET_0001_RDS |select`doctest`.`id`from`doctest`|{} || DOCTEST_1488704345426RCUPDOCTEST_CAET_0002_RDS |select`doctest`.`id`from`doctest`|{} || DOCTEST_1488704345426RCUPDOCTEST_CAET_0003_RDS |select`doctest`.`id`from`doctest`|{} || DOCTEST_1488704345426RCUPDOCTEST_CAET_0004_RDS |select`doctest`.`id`from`doctest`|{} || DOCTEST_1488704345426RCUPDOCTEST_CAET_0005_RDS |select`doctest`.`id`from`doctest`|{} || DOCTEST_1488704345426RCUPDOCTEST_CAET_0006_RDS |select`doctest`.`id`from`doctest`|{} || DOCTEST_1488704345426RCUPDOCTEST_CAET_0007_RDS |select`doctest`.`id`from`doctest`|{} |+------------------------------------------------+--------------------------------------+--------+8 rows inset(0.00 sec)
查看select * from doctest where id = 1这条 SQL 的执行计划(doctest 这张表是按照ID列进行分库的)。从执行计划可以看出该 SQL 会根据拆分键(ID)计算出具体的分库,将 SQL 直接下推到该分库,然后执行结果聚合。
mysql> explain select*from doctest where id =1;+------------------------------------------------+-----------------------------------------------------------------+--------+| GROUP_NAME | SQL | PARAMS |+------------------------------------------------+-----------------------------------------------------------------+--------+| DOCTEST_1488704345426RCUPDOCTEST_CAET_0001_RDS |select`doctest`.`id`from`doctest`where(`doctest`.`id`=1)|{} |+------------------------------------------------+-----------------------------------------------------------------+--------+1 row inset(0.01 sec)
5. EXPLAIN DETAIL SQL
查看指定 SQL 在 PolarDB-X 层面的执行计划。注意这条 SQL 不会实际执行。关于该指令的更多案例,详情请参见SQL优化基本概念、SQL优化方法。
mysql> explain detail select*from doctest where id =1;+------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+| GROUP_NAME | SQL | PARAMS |+------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+| DOCTEST_1488704345426RCUPDOCTEST_CAET_0001_RDS |Queryfrom doctest as doctestkeyFilter:doctest.id =1queryConcurrency:SEQUENTIALcolumns:[doctest.id]tableName:doctestexecuteOn:DOCTEST_1488704345426RCUPDOCTEST_CAET_0001_RDS| NULL |+------------------------------------------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+--------+1 row inset(0.02 sec)
6. EXPLAIN EXECUTE SQL
查看底层存储的执行计划,等同于 MYSQL 的 EXPLAIN 语句。关于该指令的更多案例,详情请参见SQL优化基本概念、SQL优化方法。
mysql> explain execute select*from tddl_mgr_log limit 1;+----+-------------+--------------+------+---------------+------+---------+------+------+-------+| id | select_type | table | type | possible_keys | key | key_len |ref | rows |Extra|+----+-------------+--------------+------+---------------+------+---------+------+------+-------+| 1| SIMPLE | tddl_mgr_log | ALL | NULL | NULL | NULL | NULL | 1| NULL |+----+-------------+--------------+------+---------------+------+---------+------+------+-------+1 row inset(0.07 sec)
7. TRACE SQL 和 SHOW TRACE
查看具体 SQL 的执行情况。TRACE [SQL] 和 SHOW TRACE 要结合使用。注意 TRACE SQL 和 EXPLAIN SQL 的区别在于 TRACE SQL 会实际执行该语句。关于该指令的更多案例,详情请参见SQL优化基本概念、SQL优化方法。
例如查看 select 1这条语句的执行情况。
mysql> trace select1;+---+|1|+---+|1|+---+1 row inset(0.03 sec)mysql> show trace;+------+----------+----------------+-----------------------------------+---------------+--------------------------+------+-----------+--------+| ID | TYPE | GROUP_NAME | DBKEY_NAME | TIME_COST(MS)| CONNECTION_TIME_COST(MS)| ROWS | STATEMENT | PARAMS |+------+----------+----------------+-----------------------------------+---------------+--------------------------+------+-----------+--------+| 0|Optimize| DRDS | DRDS |3 |0.00 | 0|select1 | NULL || 1|Query | TDDL5_00_GROUP | db218249098_sqa_zmf_tddl5_00_3309 |7 |0.15 | 1|select1 | NULL |+------+----------+----------------+-----------------------------------+---------------+--------------------------+------+-----------+--------+2 rows inset(0.01 sec)
8. CHECK TABLE tablename
对数据表进行检查。主要用于 DDL 建表失败的情形,关于更多应用案例详情,请参见DDL常见问题处理。
- 对于拆分表,检查底层物理分表是否有缺失的情况,底层的物理分表的列和索引是否是一致;
- 对于单库单表,检查表是否存在。
mysql> check table tddl_mgr_log;+------------------------+-------+----------+----------+| TABLE | OP | MSG_TYPE | MSG_TEXT |+------------------------+-------+----------+----------+| TDDL5_APP.tddl_mgr_log | check | status | OK |+------------------------+-------+----------+----------+1 row inset(0.56 sec)mysql> check table tddl_mg;+-------------------+-------+----------+----------------------------------------+| TABLE | OP | MSG_TYPE | MSG_TEXT |+-------------------+-------+----------+----------------------------------------+| TDDL5_APP.tddl_mg | check |Error |Table'tddl5_00.tddl_mg' doesn't exist |+-------------------+-------+----------+----------------------------------------+1 row in set (0.02 sec)
9. SHOW TABLE STATUS [LIKE ‘pattern’ | WHERE expr]
获取表的信息,该指令聚合了底层各个物理分表的数据。
重要列详解:
- NAME:表名称;
- ENGINE:表的存储引擎;
- VERSION:表的存储引擎的版本;
- ROW_FORMAT:行格式,主要是 Dynamic、Fixed、Compressed 这三种格式。动态(Dynamic)行的行长度可变,例如 VARCHAR 或 BLOB 类型字段;固定(Fixed)行是指行长度不变,例如CHAR和INTEGER类型字段;
- ROWS:表中的行数;
- AVG_ROW_LENGTH:平均每行包括的字节数;
- DATA_LENGTH:整个表的数据量(单位:字节);
- MAX_DATA_LENGTH:表可以容纳的最大数据量;
- INDEX_LENGTH:索引占用磁盘的空间大小 ;
- CREATE_TIME:表的创建时间;
- UPDATE_TIME:表的最近更新时间;
- COLLATION:表的默认字符集和字符排序规则;
- CREATE_OPTIONS:指表创建时的其他所有选项。
mysql> show table status like 'multi_db_multi_tbl';+--------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-----------------------+-------------+------------+-----------------+----------+----------------+---------+| NAME | ENGINE | VERSION | ROW_FORMAT | ROWS | AVG_ROW_LENGTH | DATA_LENGTH | MAX_DATA_LENGTH | INDEX_LENGTH | DATA_FREE | AUTO_INCREMENT | CREATE_TIME | UPDATE_TIME | CHECK_TIME | COLLATION | CHECKSUM | CREATE_OPTIONS | COMMENT |+--------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-----------------------+-------------+------------+-----------------+----------+----------------+---------+| multi_db_multi_tbl |InnoDB| 10|Compact | 2| 16384| 16384| 0| 16384| 0| 100000|2017-03-2717:43:57.0| NULL | NULL | utf8_general_ci | NULL | | |+--------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+-----------------------+-------------+------------+-----------------+----------+----------------+---------+1 row inset(0.03 sec)
和 PolarDB-X 的 SCAN HINT 结合,还可以查看每个物理分表的数据量。详情请参见HINT语法。
mysql>/!TDDL:SCAN='multi_db_multi_tbl'*/show table status like 'multi_db_multi_tbl';+----------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+--------------+|Name |Engine|Version|Row_format|Rows|Avg_row_length|Data_length|Max_data_length|Index_length|Data_free|Auto_increment|Create_time |Update_time|Check_time|Collation |Checksum|Create_options|Comment|Block_format|+----------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+--------------+| multi_db_multi_tbl_1 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_0 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_1 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_0 |InnoDB| 10|Compact | 1| 16384| 16384| 0| 16384| 0| 2|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_1 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_0 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_1 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_0 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_1 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_0 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_1 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_0 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_1 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_0 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_1 |InnoDB| 10|Compact | 0| 0| 16384| 0| 16384| 0| 1|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original || multi_db_multi_tbl_0 |InnoDB| 10|Compact | 1| 16384| 16384| 0| 16384| 0| 3|2017-03-2717:43:57| NULL | NULL | utf8_general_ci | NULL | | |Original |+----------------------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+-------------+------------+-----------------+----------+----------------+---------+--------------+16 rows inset(0.04 sec)