Bug #70444 | MyISAM engine doesnt use index for count(distinct field) query | ||
---|---|---|---|
Submitted: | 26 Sep 2013 21:57 | Modified: | 2 Dec 2013 13:56 |
Reporter: | Oleksandr Voytsekhovskyy | Email Updates: | |
Status: | Verified | Impact on me: | |
Category: | MySQL Server: DML | Severity: | S3 (Non-critical) |
Version: | 5.5.31 | OS: | Any |
Assigned to: | CPU Architecture: | Any |
[26 Sep 2013 21:57]
Oleksandr Voytsekhovskyy
[26 Sep 2013 22:39]
MySQL Verification Team
Please provide the dump file. Thanks.
[27 Sep 2013 7:40]
Oleksandr Voytsekhovskyy
SELECT count(v_1) as v_1, axis_x1, axis_y1, axis_y2 FROM norepl_sqldata_20587014 GROUP BY axis_x1, axis_y1, axis_y2; works without disk usage at all and very fast SELECT count(DISTINCT v_1) as v_1, axis_x1, axis_y1, axis_y2 FROM norepl_sqldata_20587014 GROUP BY axis_x1, axis_y1, axis_y2; use all available disk space and then crash
[27 Sep 2013 9:03]
Oleksandr Voytsekhovskyy
I have workaround: - convert table to innodb - alter table norepl_sqldata_20587014 add index t (axis_x1, axis_y1, axis_y2); if i do both this steps query works. MyISAM with index doesn't work. Innodb without index doesn't work. Only innodb with index
[27 Sep 2013 13:41]
MySQL Verification Team
I couldn't repeat with 5.6.14. I will test 5.5 mysql 5.6 > SHOW VARIABLES LIKE "%version%"; +-------------------------+---------------------+ | Variable_name | Value | +-------------------------+---------------------+ | innodb_version | 5.6.14 | | protocol_version | 10 | | slave_type_conversions | | | version | 5.6.14 | | version_comment | Source distribution | | version_compile_machine | x86_64 | | version_compile_os | Win64 | +-------------------------+---------------------+ 7 rows in set (0.00 sec) mysql 5.6 > SELECT count(distinct v_1) as v_1, axis_x1, axis_y1, axis_y2 FROM norepl_sqldata_20587014 GROUP BY axis_x1, axis_y1, axis_y2; +------+---------+---------+-------------+ | v_1 | axis_x1 | axis_y1 | axis_y2 | +------+---------+---------+-------------+ | 211 | 1 | | Glade | | 5 | 1 | | KIWI | | 236 | 1 | | Mr Muscle | | 122 | 1 | | Off | <CUT> | 1446 | 3 | E | KIWI | | 4449 | 3 | E | Mr Muscle | | 4054 | 3 | E | Off | | 670 | 3 | E | Oust | | 3203 | 3 | E | Pronto | | 4623 | 3 | E | Raid | | 1 | 3 | E | Shout | | 4782 | 3 | E | Toilet Duck | +------+---------+---------+-------------+ 170 rows in set (1 hour 2 min 8.39 sec)
[27 Sep 2013 13:45]
Oleksandr Voytsekhovskyy
Maybe, you have more than 50Gb available for temporary table? And query time is 1h, it looks like strange! On innodb query time around 3-5 min
[30 Sep 2013 13:40]
MySQL Verification Team
Thank you for the feedback. I think the big temporary file is expected with Distinct + varchars column however there is a bug with the slow performance of MyISAM engine when using an index in opposite with InnoDB engine.
[30 Sep 2013 18:26]
Oleksandr Voytsekhovskyy
MyISAM, No index, MyISAM, No index, MyISAM, Indexed - same result: mysql> explain extended SELECT count(distinct v_1) as v_1, axis_x1, 0 as axis_x2, axis_y1, axis_y2 FROM norepl_sqldata_20587014 GROUP BY axis_x1, axis_y1, axis_y2; +----+-------------+-------------------------+------+---------------+------+---------+------+----------+----------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------------------------+------+---------------+------+---------+------+----------+----------+----------------+ | 1 | SIMPLE | norepl_sqldata_20587014 | ALL | NULL | NULL | NULL | NULL | 20265125 | 100.00 | Using filesort | +----+-------------+-------------------------+------+---------------+------+---------+------+----------+----------+----------------+ 1 row in set, 1 warning (0.00 sec) mysql> explain extended SELECT count(distinct v_1) as v_1, axis_x1, 0 as axis_x2, axis_y1, axis_y2 FROM norepl_sqldata_20587014 GROUP BY axis_x1, axis_y1, axis_y2; +----+-------------+-------------------------+-------+---------------+------+---------+------+----------+----------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------------------------+-------+---------------+------+---------+------+----------+----------+-------+ | 1 | SIMPLE | norepl_sqldata_20587014 | index | NULL | t | 391 | NULL | 20231675 | 100.00 | | +----+-------------+-------------------------+-------+---------------+------+---------+------+----------+----------+-------+ 1 row in set, 1 warning (0.00 sec)
[30 Sep 2013 18:29]
Oleksandr Voytsekhovskyy
MyISAM not indexed, MyISAM indexed, InnoDB not indexed give same result: mysql> explain extended SELECT count(distinct v_1) as v_1, axis_x1, 0 as axis_x2, axis_y1, axis_y2 FROM norepl_sqldata_20587014 GROUP BY axis_x1, axis_y1, axis_y2; +----+-------------+-------------------------+------+---------------+------+---------+------+----------+----------+----------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------------------------+------+---------------+------+---------+------+----------+----------+----------------+ | 1 | SIMPLE | norepl_sqldata_20587014 | ALL | NULL | NULL | NULL | NULL | 20265125 | 100.00 | Using filesort | +----+-------------+-------------------------+------+---------------+------+---------+------+----------+----------+----------------+ 1 row in set, 1 warning (0.00 sec) InnoDB indexed doing much better: mysql> explain extended SELECT count(distinct v_1) as v_1, axis_x1, 0 as axis_x2, axis_y1, axis_y2 FROM norepl_sqldata_20587014 GROUP BY axis_x1, axis_y1, axis_y2; +----+-------------+-------------------------+-------+---------------+------+---------+------+----------+----------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+-------------------------+-------+---------------+------+---------+------+----------+----------+-------+ | 1 | SIMPLE | norepl_sqldata_20587014 | index | NULL | t | 391 | NULL | 20231675 | 100.00 | | +----+-------------+-------------------------+-------+---------------+------+---------+------+----------+----------+-------+ 1 row in set, 1 warning (0.00 sec)
[1 Oct 2013 12:16]
MySQL Verification Team
I agreed that the index doesn't works with MyISAM then I suggest you to change the Synopsis. Thanks.
[2 Nov 2013 1:00]
Bugs System
No feedback was provided for this bug for over a month, so it is being suspended automatically. If you are able to provide the information that was originally requested, please do so and change the status of the bug back to "Open".
[2 Nov 2013 7:04]
Oleksandr Voytsekhovskyy
Synopsis changed
[2 Dec 2013 13:56]
MySQL Verification Team
\thank you for the feedback. Only MyISAM engine affected.