dashboard 执行计划与实际执行计划不一致

能否重复得到走 pointGet 的结果? 因为 user_id 的 collation 是 general_ci, 所以该查询无法进行常量传播。

我单独执行sql是可以的,完全就是pointGet。执行多次都是一样的,不会变,但是程序端连接的,就是另一个执行计划,都是超过500ms以上的,都是慢日志。不知道咋回事

确认下单独执行 sql 时连接的 tidb 和后台执行的是否一样?

确定是一样的,单独执行是连接的中间haproxy,程序端连接的也是中间件。我单独拿一台tidb连接,执行的结果也是一样会走pointGet

单独执行的计划 (45.4 KB)

u.user_id = ‘zm123456’ 换成 iub.user_id = ‘zm123456’ 试试两边的执行结果呢?

4 (27.3 KB)

换了就不一样了。换了速度也很快了。但是程序端没有办法测试,只有上了代码才知道。

麻烦确认下:
show variables like “%collation%”;

后台连接时的也确认下。应该是这两处不同导致的。

image
是collation_server 和collation_database不一致导致的吗?

collation_connection 会影响常量传播的规则,具体是否是 bug 我还得再研究下,可以先通过 u.user_id = ‘zm123456’ and iub.user_id = ‘zm123456’ 绕过去。

好的感谢

@blaine
已经确认是 bug:https://github.com/pingcap/tidb/issues/22665, 将在后续版本中修复。
推荐绕过方式是设置连接时的 collation 为 utf8mb4_bin, 同时显式的指定 u.user_id = ‘zm123456’ and iub.user_id = ‘zm123456’ 。

该表中使用了混合的字符集与排序规则,既有 utf8mb4_general_ci,还有utf8_bin。在连接的 collation 设置为 utf8_general_ci 时有可能进行不正确的常量传播。建议以后使用一致的 utf8mb4_general_ci 或者 utf8mb4_bin。

好的,非常感谢

好的,感谢

:+1:

为什么我插入汉字的时候出现空白插入啊。什么原因导致的啊。CREATE TABLE ims_user_login_config (
-> id int(11) NOT NULL AUTO_INCREMENT COMMENT ‘’,
-> register_name varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘’,
-> is_register_unique varchar(5) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ‘0’ COMMENT ‘’,
-> is_not_null varchar(5) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ‘0’ COMMENT ‘’,
-> is_set_register_term varchar(5) COLLATE utf8mb4_general_ci NOT NULL DEFAULT ‘0’ COMMENT ‘’,
-> is_open_phone_code tinyint(1) NOT NULL DEFAULT ‘0’ COMMENT ‘’,
-> create_time datetime DEFAULT NULL COMMENT ‘’,
-> create_by varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘’,
-> update_time datetime DEFAULT NULL COMMENT ‘’,
-> update_by varchar(50) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT ‘’,
-> register_field_name varchar(25) COLLATE utf8mb4_general_ci NOT NULL COMMENT ‘’,
-> is_open_phone_register tinyint(1) DEFAULT ‘1’ COMMENT ’ 0 1’,
-> ali_or_vonage tinyint(1) DEFAULT ‘0’ COMMENT ‘:0 Vonage 1 ‘,
-> PRIMARY KEY (id)
-> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci AUTO_INCREMENT=90029 COMMENT=’’;这个是表结构,我再测试环境测试是没有问题的,但是我生产环境除了更改collation,其他没有改动啊。

已经知道问题了。已解决,

如果方便可以讲问题记录一下,方便其他同学进行查看,

另外如果有新的问题,麻烦创建新的帖子。感谢反馈~

之前说的执行计划不准,是因为collation不一致导致,现在我已经已经将数据的collation都更改一致了,但是还是有的执行计划和后台查询的不一致。

这个是dashboard的执行计划
这个是后台执行的执行计划

执行计划以后台查询为准,dashboard 的执行计划是从 slow query 记录的 plan digest 记录转译的。