| Bug #69553 | Wasted work in method mi_test_if_sort_rep() | ||
|---|---|---|---|
| Submitted: | 23 Jun 2013 13:56 | Modified: | 1 Jul 2013 16:36 |
| Reporter: | Po-Chun Chang (OCA) | Email Updates: | |
| Status: | Closed | Impact on me: | |
| Category: | MySQL Server: MyISAM storage engine | Severity: | S5 (Performance) |
| Version: | 5.6, 5.7 | OS: | Any |
| Assigned to: | CPU Architecture: | Any | |
| Tags: | patch, performance | ||
[23 Jun 2013 13:57]
Po-Chun Chang
Suggested patch (*) I confirm the code being submitted is offered under the terms of the OCA, and that I am authorized to contribute it.
Contribution: patch.diff (text/plain), 572 bytes.
[24 Jun 2013 6:57]
MySQL Verification Team
Hello Chang, Thank you for the report and contribution. Regards, Umesh
[27 Jun 2013 13:41]
Ståle Deraas
Thank you for your contribution. We will include it in a coming release.
[1 Jul 2013 16:36]
Paul DuBois
Noted in 5.7.2 changelog. Several inefficiencies were corrected: A loop in Item_in_subselect::single_value_transformer() could execute too many times. The myisamchk(), my_test_if_sort_rep(), and recreate_table() functions in MyISAM code could execute too many times. Thanks to Po-Chun Chang for the patches to correct these issues.

Description: The problem appears in version 5.6 and in the revision 5216 in version 5.7. I attached a one-line patch that fixes it. In method "mi_test_if_sort_rep" in mi_check.c, the loop on line 4706 should not be executed when "force" is TRUE. When "force" is TRUE, all the iterations do not perform any useful work. How to repeat: Once mi_test_if_sort_rep() is executed. Suggested fix: === modified file 'storage/myisam/mi_check.c' --- storage/myisam/mi_check.c 2013-02-27 15:33:55 +0000 +++ storage/myisam/mi_check.c 2013-06-23 13:54:44 +0000 @@ -4703,10 +4703,13 @@ */ if (! mi_is_any_key_active(key_map)) return FALSE; /* Can't use sort */ - for (i=0 ; i < share->base.keys ; i++,key++) + if (!force) { - if (!force && mi_too_big_key_for_sort(key,rows)) - return FALSE; + for (i=0 ; i < share->base.keys ; i++,key++) + { + if (mi_too_big_key_for_sort(key,rows)) + return FALSE; + } } return TRUE; }