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 目前不支持 SQL 执行计划的显示,仅支持查看分布式情况下的数据路由情况。可通过PREVIEW命令进行查看,可显示具体执行的 SQL 及对应的数据分片。
SQL Hint #
SQL HINT 就是通过在 SQL 语句上增加注释,从而实现强制路由的一种 Hint 方式。它降低了用户改造代码的成本。通过注释的方式我们可以方便地将 SQL 直接送达指定数据库执行而无视其它分片逻辑。以多租户场景为例,用户不用再配置复杂的分库逻辑,也无需改造业务逻辑,只需要将指定库添加到注释信息中即可。 注释格式暂时只支持 /* */,内容需要以 SHARDINGSPHERE_HINT: 开始。
使用方法 #
注释
SQL HINT 的使用非常简单。
第一步打开注释解析开关。将 sqlCommentParseEnabled 设置为 true。
第二步在 SQL 上增加注释即可。目前 SQL HINT 支持指定数据源路由和主库路由。
数据源路由
目前只支持路由至一个数据源。内容需要以 ShardingSphere hint:开始,属性名为 dataSourceName。
/* ShardingSphere hint: dataSourceName=ds_0 */
SELECT * FROM t_order;
- 主库路由
支持路由到主库,内容需要以ShardingSphere hint:开始,属性名为 WRITE_ROUTE_ONLY。
/* SHARDINGSPHERE_HINT: WRITE_ROUTE_ONLY=true */
SELECT * FROM t_order;
- 分片路由
支持路由到某一分片,可选的属性包括:
- {table}.SHARDING_DATABASE_VALUE:用于添加 {table} 表对应的数据源分片键值,多个属性使用逗号分隔;
- {table}.SHARDING_TABLE_VALUE:用于添加 {table} 表对应的表分片键值,多个属性使用逗号分隔。 注意,在分库不分表情况下,强制路由至某一个分库时,可使用 SHARDING_DATABASE_VALUE 方式设置分片,无需指定 {table}。
DistSQL Hint #
| 语句 | 说明 | 示例 |
|---|---|---|
| set readwrite_splitting hint source = [auto / write] | 针对当前连接,设置读写分离的路由策略(自动路由或强制到写库) | set readwrite_splitting hint source = write |
| set sharding hint database_value = yy | 针对当前连接,设置 hint 仅对数据库分片有效,并添加分片值,yy:数据库分片值 | set sharding hint database_value = 100 |
| add sharding hint database_value xx = yy | 针对当前连接,为表 xx 添加分片值 yy,xx:逻辑表名称,yy:数据库分片值 | add sharding hint database_value t_order= 100 |
| add sharding hint table_value xx = yy | 针对当前连接,为表 xx 添加分片值 yy,xx:逻辑表名称,yy:表分片值 | add sharding hint table_value t_order = 100 |
| clear hint | 针对当前连接,清除 hint 所有设置 | clear hint |
| clear [sharding hint / readwrite_splitting hint] | 针对当前连接,清除 sharding 或 readwrite_splitting 的 hint 设置 | clear readwrite_splitting hint |
| show [sharding / readwrite_splitting] hint status | 针对当前连接,查询 sharding 或 readwrite_splitting 的 hint 设置 | show readwrite_splitting hint status |