Uploaded image for project: 'MariaDB Server'
  1. MariaDB Server
  2. MDEV-15433

Optimizer does not use group by optimization with distinct

Details

    Description

      This is similar to the following upstream bug that was fixed in MySQL 5.6, but this problem seems to effect all InnoDB tables in MariaDB 10.1, not just partitioned ones:

      https://bugs.mysql.com/bug.php?id=60023

      For example, run the following test:

      CREATE TABLE tbl1 (id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, a INT NOT NULL, KEY(a)) ENGINE=InnoDB;
      INSERT INTO tbl1(a) VALUES (1), (2), (3), (4);
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
      INSERT INTO tbl1(a) SELECT a FROM tbl1;
       
      OPTIMIZE TABLE tbl1;
      EXPLAIN SELECT DISTINCT a FROM tbl1;
      SELECT DISTINCT a FROM tbl1;
      EXPLAIN SELECT a FROM tbl1 GROUP BY a;
      SELECT a FROM tbl1 GROUP BY a;
      

      Here's the output seen on MariaDB 10.1.31:

      MariaDB [db1]> EXPLAIN SELECT DISTINCT a FROM tbl1;
      +------+-------------+-------+-------+---------------+------+---------+------+-------+-------------+
      | id   | select_type | table | type  | possible_keys | key  | key_len | ref  | rows  | Extra       |
      +------+-------------+-------+-------+---------------+------+---------+------+-------+-------------+
      |    1 | SIMPLE      | tbl1  | index | NULL          | a    | 4       | NULL | 65895 | Using index |
      +------+-------------+-------+-------+---------------+------+---------+------+-------+-------------+
      1 row in set (0.00 sec)
       
      MariaDB [db1]> SELECT DISTINCT a FROM tbl1;
      +---+
      | a |
      +---+
      | 1 |
      | 2 |
      | 3 |
      | 4 |
      +---+
      4 rows in set (0.02 sec)
       
      MariaDB [db1]> EXPLAIN SELECT a FROM tbl1 GROUP BY a;
      +------+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      | id   | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |
      +------+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      |    1 | SIMPLE      | tbl1  | range | NULL          | a    | 4       | NULL |    7 | Using index for group-by |
      +------+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      1 row in set (0.00 sec)
       
      MariaDB [db1]> SELECT a FROM tbl1 GROUP BY a;
      +---+
      | a |
      +---+
      | 1 |
      | 2 |
      | 3 |
      | 4 |
      +---+
      4 rows in set (0.00 sec)
      

      Compare this to the output seen on 5.6.38:

      mysql> EXPLAIN SELECT DISTINCT a FROM tbl1;
      +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      | id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |
      +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      |  1 | SIMPLE      | tbl1  | range | a             | a    | 4       | NULL |    7 | Using index for group-by |
      +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      1 row in set (0.00 sec)
       
      mysql> SELECT DISTINCT a FROM tbl1;
      +---+
      | a |
      +---+
      | 1 |
      | 2 |
      | 3 |
      | 4 |
      +---+
      4 rows in set (0.00 sec)
       
      mysql> EXPLAIN SELECT a FROM tbl1 GROUP BY a;
      +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      | id | select_type | table | type  | possible_keys | key  | key_len | ref  | rows | Extra                    |
      +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      |  1 | SIMPLE      | tbl1  | range | a             | a    | 4       | NULL |    7 | Using index for group-by |
      +----+-------------+-------+-------+---------------+------+---------+------+------+--------------------------+
      1 row in set (0.00 sec)
       
      mysql> SELECT a FROM tbl1 GROUP BY a;
      +---+
      | a |
      +---+
      | 1 |
      | 2 |
      | 3 |
      | 4 |
      +---+
      4 rows in set (0.00 sec)
      

      Attachments

        Issue Links

          Activity

            GeoffMontee Geoff Montee (Inactive) created issue -
            GeoffMontee Geoff Montee (Inactive) made changes -
            Field Original Value New Value
            elenst Elena Stepanova made changes -
            Fix Version/s 10.1 [ 16100 ]
            Assignee Alice Sherepa [ alice ]
            alice Alice Sherepa made changes -
            Status Open [ 1 ] In Progress [ 3 ]
            alice Alice Sherepa made changes -
            Assignee Alice Sherepa [ alice ] Sergei Petrunia [ psergey ]
            psergei Sergei Petrunia made changes -
            Status In Progress [ 3 ] Stalled [ 10000 ]
            psergei Sergei Petrunia made changes -
            Fix Version/s 10.3 [ 22126 ]
            Fix Version/s 10.1 [ 16100 ]
            ratzpo Rasmus Johansson (Inactive) made changes -
            Priority Major [ 3 ] Critical [ 2 ]
            varun Varun Gupta (Inactive) made changes -
            Assignee Sergei Petrunia [ psergey ] Varun Gupta [ varun ]
            varun Varun Gupta (Inactive) made changes -
            Status Stalled [ 10000 ] In Progress [ 3 ]
            varun Varun Gupta (Inactive) made changes -
            varun Varun Gupta (Inactive) made changes -
            Assignee Varun Gupta [ varun ] Igor Babaev [ igor ]
            Status In Progress [ 3 ] In Review [ 10002 ]
            varun Varun Gupta (Inactive) made changes -
            Fix Version/s 10.1 [ 16100 ]
            Fix Version/s 10.3 [ 22126 ]
            igor Igor Babaev (Inactive) made changes -
            Status In Review [ 10002 ] Stalled [ 10000 ]
            igor Igor Babaev (Inactive) made changes -
            Assignee Igor Babaev [ igor ] Varun Gupta [ varun ]
            varun Varun Gupta (Inactive) made changes -
            Fix Version/s 10.1.35 [ 23116 ]
            Fix Version/s 10.1 [ 16100 ]
            Resolution Fixed [ 1 ]
            Status Stalled [ 10000 ] Closed [ 6 ]
            serg Sergei Golubchik made changes -
            Workflow MariaDB v3 [ 85773 ] MariaDB v4 [ 153875 ]
            mariadb-jira-automation Jira Automation (IT) made changes -
            Zendesk Related Tickets 123686

            People

              varun Varun Gupta (Inactive)
              GeoffMontee Geoff Montee (Inactive)
              Votes:
              3 Vote for this issue
              Watchers:
              10 Start watching this issue

              Dates

                Created:
                Updated:
                Resolved:

                Git Integration

                  Error rendering 'com.xiplink.jira.git.jira_git_plugin:git-issue-webpanel'. Please contact your Jira administrators.