SQL 管理 #
SQL慢查询 #
背景信息 #
慢查询日志功能,用于将执行耗时超过一定时间的 SQL 语句进行记录,便于 DBA 和开发人员识别可能存在问题的 SQL 语句,是数据库和 SQL 管理的重要参考来源。
配置及参数 #
慢查询日志功能基于 Agent 技术实现,仅适用于 SphereEx-DBPlusEngine 且启用 Agent 的场景。
由于慢查询日志是基于 Agent 的功能,因此以下配置位于 agent.yaml 中:
plugins:
Logging:
props:
slow_query_log: true
long_query_time: 5000
- slow_query_log:是否开启慢查询日志功能,默认值为 true。
- long_query_time:慢查询时间阈值,执行耗时超过该阈值的 SQL 语句才会被记入慢查询日志中。该配置单位为毫秒(ms),默认值为 5000。
慢查询日志格式 #
timestamp: {time} db: {db database user: {user} host: {host} query_time: {query time} {sql}
- timestamp:日志记录产生的时间;
- db:数据库名称;
- user:当前连接中使用的用户名称;
- host:客户端访问地址;
- query_time:SQL 执行耗时,单位为 ms;
- sql:出现慢查询时,客户端发送的 SQL 语句。
慢查询日志示例 #
timestamp: 2022-07-01 00:00:00.000 db: sharding_db user: root host: 127.0.0.1 query_time: 159
CREATE TABLE `t_order` (
`order_id` bigint(20) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`status` varchar(50) COLLATE utf8mb4_bin DEFAULT NULL,
PRIMARY KEY (`order_id`)
)
SQL执行计划 #
SphereEx-DBPlusEngine 支持两种查看执行计划的方式,一种是传统的 EXPLAIN 方式,一种是 PREVIEW 方式。前者可查看下发到存储节点的 SQL 真实执行计划;后者可查看分布式情况下的数据路由情况。
- EXPLAIN
EXLAIN 使用很简单,直接在命令行中即可。对于存储节点使用 MySQL 数据库,这一命令可直接调用底层数据库的对应命令;对于存储节点使用 openGauss 数据库,可使用 EXPLAIN PERFORMANCE
mysql> explain select * from t_single0;
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | t_single0 | NULL | ALL | NULL | NULL | NULL | NULL | 4 | 100.0 | NULL |
+----+-------------+-----------+------------+------+---------------+------+---------+------+------+----------+-------+
mysql> explain select * from t_shard1;
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+-------+
| 1 | SIMPLE | t_shard1_0 | NULL | ALL | NULL | NULL | NULL | NULL | 2 | 100.0 | NULL |
+----+-------------+------------+------------+------+---------------+------+---------+------+------+----------+-------+
说明:对于分片表来说,上述命令会显示某一分片上的执行计划,尚无法获得完整的分布式执行计划。
- PREVIEW
通过PREVIEW命令进行查看,可显示具体执行的 SQL 及对应的数据分片。
mysql> preview select * from t_shard1;
+------------------+-------------------------------------------------------------+
| data_source_name | actual_sql |
+------------------+-------------------------------------------------------------+
| test1_3307 | select * from t_shard1_0 UNION ALL select * from t_shard1_2 |
| test1_3308 | select * from t_shard1_1 UNION ALL select * from t_shard1_3 |
+------------------+-------------------------------------------------------------+
SQL Hint #
SQL HINT 就是通过在 SQL 语句上增加注释,从而实现强制路由的一种 Hint 方式。它降低了用户改造代码的成本。通过注释的方式我们可以方便地将 SQL 直接送达指定数据库执行而无视 Engine 的功能逻辑。
以多租户场景为例,用户不用再配置复杂的分库逻辑,也无需改造业务逻辑,只需要将指定库添加到注释信息中即可。 SQL Hint 注释格式暂时只支持 /* */
,内容需要以 SPHEREEX_HINT
开始,Engine 也保持了对 ShardingSphere SQL Hint 的兼容,支持以 SHARDINGSPHERE_HINT:
开始。
使用方法 #
SQL HINT 的使用非常简单。直接在 SQL 上增加注释即可。以下展示了使用 SQL HINT 实现数据源透传的示例,其他 SQL HINT 语法及示例请参考 SQL Hint。
/* SPHEREEX_HINT: DATA_SOURCE_NAME=ds_0 */ SELECT * FROM t_order;