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

这个是导出的统计信息。但是user表导出报错,说字段长度不够,这样的错,tidb日志里面报好多次了。每次报错,我都是更改字段长度来解决的。但是现在日志里面没有报错,导出统计信息报错了。需要我更改字段之后再导出统计信息给你吗?

请问下集群是否打开了 new-collation?

select * from mysql.tidb where VARIABLE_NAME = “new_collation_enabled”;

开启了,是新的模板

能否重复得到走 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,其他没有改动啊。

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