| Bug #117867 | use distinct+left join, MySQL 8.0 excute long time than MySQL 5.7 | ||
|---|---|---|---|
| Submitted: | 3 Apr 8:32 | Modified: | 9 Apr 10:18 |
| Reporter: | haizhen xue | Email Updates: | |
| Status: | Verified | Impact on me: | |
| Category: | MySQL Server: Optimizer | Severity: | S5 (Performance) |
| Version: | 8.0.41 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | regression | ||
[3 Apr 8:32]
haizhen xue
[3 Apr 9:15]
haizhen xue
MYSQL 8.0, read examine 18011 rows.
mysql> show status like '%Handler_read_next%';
+-------------------+--------+
| Variable_name | Value |
+-------------------+--------+
| Handler_read_next | 144481 |
+-------------------+--------+
1 row in set (0.00 sec)
mysql>
mysql>
mysql> explain analyze SELECT DISTINCT juua.unit_oid FROM JDB_USER_UNIT_AUTH juua LEFT JOIN jdb_role_menu r ON juua.system_position_oid = r.role_id WHERE juua.user_id = 'xxx';
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| EXPLAIN |
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| -> Table scan on <temporary> (cost=2.53..4.8 rows=8) (actual time=19..19 rows=1 loops=1)
-> Temporary table with deduplication (cost=2.2..2.2 rows=8) (actual time=19..19 rows=1 loops=1)
-> Nested loop left join (cost=1.4 rows=8) (actual time=0.0411..14.3 rows=18010 loops=1)
-> Covering index lookup on juua using USER_UNIT_AUTH_IDX_JOINT1 (user_id='xxx') (cost=0.35 rows=1) (actual time=0.0254..0.0292 rows=1 loops=1)
-> Covering index lookup on r using IDX_ROLE_ID (role_id=juua.system_position_oid) (cost=1.05 rows=8) (actual time=0.0144..12.7 rows=18010 loops=1)
|
+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.02 sec)
mysql> show status like '%Handler_read_next%';
+-------------------+--------+
| Variable_name | Value |
+-------------------+--------+
| Handler_read_next | 162492 |
+-------------------+--------+
1 row in set (0.00 sec)
MySQL 5.7 read examine 1 rows.
mysql> show status like '%Handler_read_next%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Handler_read_next | 0 |
+-------------------+-------+
1 row in set (0.00 sec)
mysql>
mysql> SELECT DISTINCT juua.unit_oid FROM JDB_USER_UNIT_AUTH juua LEFT JOIN jdb_role_menu r ON juua.system_position_oid = r.role_id WHERE juua.user_id = 'xxx';
+----------+
| unit_oid |
+----------+
| 1 |
+----------+
1 row in set (0.00 sec)
mysql> show status like '%Handler_read_next%';
+-------------------+-------+
| Variable_name | Value |
+-------------------+-------+
| Handler_read_next | 1 |
+-------------------+-------+
1 row in set (0.00 sec)
[3 Apr 9:19]
haizhen xue
insert into jdb_user_unit_auth values('xxx',1,'xxx','x','xxx','xxx',1,'x','x','x');
loops 18011,insert 18011 same rows:
insert into jdb_role_menu values('xxx',1,'xxx','2017-08-08 12:12:12','xxx','2017-08-08 12:12:12','xxx','xxx','x','x','x');
[3 Apr 9:21]
haizhen xue
table: CREATE TABLE `jdb_role_menu` ( `menu_code` varchar(20) DEFAULT NULL COMMENT 'TRIAL', `role_id` bigint NOT NULL COMMENT 'TRIAL', `created_by_code` varchar(20) DEFAULT NULL COMMENT 'TRIAL', `created_date` datetime DEFAULT NULL COMMENT 'TRIAL', `updated_by_code` varchar(20) DEFAULT NULL COMMENT 'TRIAL', `updated_date` datetime DEFAULT NULL COMMENT 'TRIAL', `created_by_name` varchar(20) DEFAULT NULL COMMENT 'TRIAL', `updated_by_name` varchar(20) DEFAULT NULL COMMENT 'TRIAL', `trial753` char(1) DEFAULT NULL COMMENT 'TRIAL', `trial680` char(1) DEFAULT NULL COMMENT 'TRIAL', `trial755` char(1) DEFAULT NULL COMMENT 'TRIAL', KEY `IDX_ROLE_ID_MENU_CODE` (`menu_code`,`role_id`), KEY `IDX_ROLE_ID` (`role_id`) USING BTREE, KEY `IDX_MENU_CODE` (`menu_code`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='TRIAL'; CREATE TABLE `jdb_user_unit_auth` ( `user_id` varchar(20) NOT NULL COMMENT 'TRIAL', `unit_oid` bigint NOT NULL COMMENT 'TRIAL', `unit_name` varchar(1000) NOT NULL COMMENT 'TRIAL', `unit_status` varchar(2) DEFAULT NULL COMMENT 'TRIAL', `unit_kind` varchar(20) DEFAULT NULL COMMENT 'TRIAL', `unit_category_code` varchar(20) DEFAULT NULL COMMENT 'TRIAL', `system_position_oid` bigint NOT NULL COMMENT 'TRIAL', `trial847` char(1) DEFAULT NULL COMMENT 'TRIAL', `trial739` char(1) DEFAULT NULL COMMENT 'TRIAL', `trial859` char(1) DEFAULT NULL COMMENT 'TRIAL', KEY `INDEX_POSITION_ID` (`system_position_oid`), KEY `INDEX_UNIT_OID` (`unit_oid`), KEY `USER_UNIT_AUTH_IDX_JOINT1` (`user_id`,`unit_oid`,`system_position_oid`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COMMENT='TRIAL';
[9 Apr 8:38]
MySQL Verification Team
Hello haizhen xue, Thank you for the report and feedback. Could you please attach "test.sql" to the bug report? Thank you. regards, Umesh
[9 Apr 10:18]
MySQL Verification Team
Hello haizhen xue, Thank you for the report and test case. regards, Umesh
