| Bug #117439 | Suspicious behaviour around creation of multi-column indexes | ||
|---|---|---|---|
| Submitted: | 11 Feb 14:27 | Modified: | 12 Feb 6:46 | 
| Reporter: | Emily Ong | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S2 (Serious) | 
| Version: | 8.0, 8.0.41, 8.4.4, 9.2.0 | OS: | Ubuntu | 
| Assigned to: | CPU Architecture: | x86 | |
   [11 Feb 14:27]
   Emily Ong        
  
 
   [12 Feb 6:46]
   MySQL Verification Team        
  Hello Emily Ong, Thank you for the report and test case. regards, Umesh
   [20 Feb 13:12]
   huahua xu        
  Hi all:
The 5th row affects the cost evaluation of covering_index_scan and group_skip_scan,  so that the optimizer chooses a different physical execution plan.
mysql> explain format=tree SELECT t0.c0 AS ref0, MAX(t0.c1) AS ref1 FROM t0 WHERE (t0.c1 = 1) > 0 GROUP BY t0.c0;
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                                                                    |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Group aggregate: max(t0.c1)  (cost=1.05 rows=2)
    -> Filter: ((t0.c1 = 1) > 0)  (cost=0.65 rows=4)
        -> Covering index scan on t0 using i0  (cost=0.65 rows=4)
 |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
mysql> INSERT INTO t0(c0, c1) VALUES(1, 1);
mysql> explain format=tree SELECT  t0.c0 AS ref0,  MAX(t0.c1) AS ref1 FROM t0 WHERE (t0.c1 = 1) > 0 GROUP BY t0.c0;
+-----------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                     |
+-----------------------------------------------------------------------------------------------------------------------------+
| -> Filter: ((t0.c1 = 1) > 0)  (cost=1 rows=3)
    -> Covering index skip scan for grouping on t0 using i0  (cost=1 rows=3)
 |
+-----------------------------------------------------------------------------------------------------------------------------+
Undeniably, it is a bug.
mysql> explain format=tree SELECT    t0.c0 AS ref0,     MAX(t0.c1) AS ref1 FROM t0 WHERE (t0.c1 = 1)  GROUP BY t0.c0;
+-------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN                                                                                                                             |
+-------------------------------------------------------------------------------------------------------------------------------------+
| -> Filter: (t0.c1 = 1)  (cost=1 rows=3)
    -> Covering index skip scan for grouping on t0 using i0 over (c1 = 1)  (cost=1 rows=3)
 |
+-------------------------------------------------------------------------------------------------------------------------------------+
It may be a solution that the predicate condition `(t0.c1 = 1) > 0` should be transformed to `t0.c1 = 1` by the predicate logic inference rules during optimizing conditions.
 