程序是用的utf8
接下来还需要排查什么?
程序是用的utf8
接下来还需要排查什么?
1、show global bindings、原始慢SQL我在前面都上传附件了。
2、dashboard中的慢SQLschema 与show global bindings 中的default_db是一致的。
3、我在shell中执行了从dashboard中复制的慢SQL,然后再 select @@tidb_use_plan_baselines; 显示为1。
麻烦提供下可以复现的具体步骤和SQL,包括表结构,执行的binding 语句等。我们这边看是否能复现。
1、过程:程序查询TiDB产生大量慢查询,根据dashboard提供的慢查询,采用SPM binding正确索引,手动执行SQL正常。
2、show global bindings show global bindings (852 字节) 如下:
3、表结构如下:
create table (649 字节)
从下面的图片可以看出,dashboard 上面显示的计划,SQL 原文中没有 Limit 语句,而执行计划中有一个 Limit 1;
1、目前与开发确认程序侧是没有limit设置的。
2、从dashboard以及information.slow_query表中取到的原始SQL来看,语句中没有limit,执行计划中确实有。
1、可以查看下代码或者框架里面是否有sql_select_limit关键字
2、可以让开发那边测试下直接返回show variables like 'sql_select_limit’的值是多少。
如果框架带了limit,为何dashboard和information.slow_query表中捕获的慢查询语句没有带limit呢?
这是因为如果是设置的session变量,或者是框架设置的参数,这个是不会算在SQL语句里面,dashboard里面没有记录也是可能的。
如果我换个方式做SPM,即在原始SQL和绑定SQL后都加上 limit ‘?’
再运行业务,观察慢查询,是否是一种手段?
我测试使用原始SQL后加 limit 1 进行 explain analyze 确实很慢,应该是没走SPM了。
你尝试使用SPM加limit 了吗?
应用程序这个参数是怎么加上去的
加了,发现一个问题,不可以 limit ‘?’ , 但是可以 limit 1, 目前观察 即使SPM limit 1, 我手动执行SQL limit 123 或者limit 任意,都可以按照SPM去走。
@h5n1暂时没查出程序侧limit是哪里来的
1、show global binding, 模板绑定的是 limit 1
2、执行查询 limit 123,发现是按照SPM走的
今晚程序跑的还是有不按照SPM运行的现象。
└─Limit_15 root 1 offset:0, count:1
我SPM中就是写死limit 1,难道这个隐藏的语法有 limit 0,1 这种写法?
你们采用什么开发语言、开发框架、驱动的呢?
可以按照这个来测试下
select * from test . t limit ...
没明白这个‘limit … ’是什么意思