Logo
SQL 管理

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;