【 TiDB 版本】V7.5.4
【遇到的问题:问题现象及影响】
有两张表数据量如下图。一张 1500 万行,一张 2300 万行
分别执行下图中sql,具体结果如下图。首先,第一张图中的结果从业务上看,数量不符。其次,第二句取值为空也不正确。 想知道是哪里使用不正确还是什么问题。
【 TiDB 版本】V7.5.4
【遇到的问题:问题现象及影响】
有两张表数据量如下图。一张 1500 万行,一张 2300 万行
分别执行下图中sql,具体结果如下图。首先,第一张图中的结果从业务上看,数量不符。其次,第二句取值为空也不正确。 想知道是哪里使用不正确还是什么问题。
看下两个语句的执行计划
第一句改成count(*) 什么结果
用explain analyze 看下
count(*) 跟count(fld_guid)返回的结构不一样,表里本来就有空数据?
理论上有空数据count字段返回少,* 返回多,这里是反的
他count* 返回15327560,count字段返回15327118,我应该没看错吧
没看错,count(*) 执行计划应该走的索引,可能索引有问题
你的意思是fld_cancel=1的结果是对的,<>1是不对的?
如果过滤的数据量少的话是没有问题的。如果数据量多有问题。
我感觉是个bug。
https://docs.pingcap.com/zh/tidb/stable/sql-plan-replayer#使用-plan-replayer-保存和恢复集群现场信息
收集执行现场,去github提个issue看看。
好的。我试试 ,感谢。
有做过备份还原么?跟我们之前向非空库还原的情况很相似。
还有一种情况是需要做admin check
https://docs.pingcap.com/zh/tidb/stable/sql-statement-admin-check-table-index#admin-check-tableindex
说不定建个新的表结构,把数据copy 过来就好了
如果索引和表不一致,不知道insert select的结果是不是正确的。
admin check 校验一下表和索引看看呢
https://docs.pingcap.com/zh/tidb/stable/sql-statement-admin-check-table-index#admin-check-tableindex
你用join 关联试试 看看效果