【TiDB 使用环境】生产环境
【TiDB 版本】
【操作系统】
在生产库中, ifnull 函数经常被用的where 后面连接条件中,造成全表扫的情况,效率很低。
select *
FROM
a
LEFT JOIN b ON b.bussinessno = 'MERGE|COINS20251223175117'
AND groupno = '2'
AND a.certino = b.certino
AND IFNULL(a.payno, 1) = b.payno
执行计划
| id | estRows | estCost | actRows | task | access object | execution info
| Insert_1 | 0.00 | 0.00 | 0 | root | | time:5m44.7s, loops:1, prepare: 5m44.7s, insert:33.7ms, lock_keys: {tim
| └─Projection_11 | 1002.55 | 112603832836.80 | 353 | root | | time:5m44.7s, loops:6, Concurrency:OFF
| └─HashJoin_29 | 1002.55 | 112603758596.21 | 353 | root | | time:5m44.7s, loops:6, build_hash_table:{total:7.82ms, fetch:7.48ms, bu
| ├─IndexLookUp_36(Build) | 341.62 | 1895408.50 | 354 | root | | time:7.44ms, loops:2, index_task: {total_time: 1.69ms, fetch_handle: 1.
| │ ├─IndexRangeScan_33(Build) | 956.06 | 251839.23 | 354 | cop[tikv] | table:b, index:INX_CPT_BUSSINESSNO(bussinessno, groupno) | time:1.64ms, loops:3, cop_task: {num: 2, max: 795µs, min: 760.3µs, avg:
| │ └─Selection_35(Probe) | 341.62 | 485323.59 | 354 | cop[tikv] | | time:4.09ms, loops:2, cop_task: {num: 1, max: 3.79ms, proc_keys: 354, t
| │ └─TableRowIDScan_34 | 956.06 | 389909.04 | 354 | cop[tikv] | table:b | tikv_task:{time:0s, loops:4}
| └─Projection_30(Probe) | 261976638.00 | 102143674297.61 | 261871926 | root | | time:5m36.1s, loops:258622, Concurrency:OFF
| └─TableReader_32 | 261976638.00 | 97672833388.83 | 261871926 | root | | time:5m15.5s, loops:258622, cop_task: {num: 22683, max: 0s, min: 0s, av
| └─TableFullScan_31 | 261976638.00 | 110925364685.95 | 261871926 | cop[tikv] | table:a | tikv_task:{proc max:490ms, min:0s, avg: 74.1ms, p80:130ms, p95:310ms, i
针对这个情况也只能进行改成。所以这个ifnull 函数是应该适合用select 中做null的判断?