Bug #41890 | Falcon: New execution plans with MRR cause slowdown for group of queries | ||
---|---|---|---|
Submitted: | 5 Jan 2009 22:53 | Modified: | 23 Apr 2009 1:21 |
Reporter: | Alexey Stroganov | Email Updates: | |
Status: | Closed | Impact on me: | |
Category: | MySQL Server: Optimizer | Severity: | S3 (Non-critical) |
Version: | 6.0.9-release | OS: | Any |
Assigned to: | Sergey Petrunya | CPU Architecture: | Any |
Tags: | F_SERVER |
[5 Jan 2009 22:53]
Alexey Stroganov
[5 Jan 2009 22:54]
Alexey Stroganov
Helper script for the issue
Attachment: bug-falcon_mrr.pl (application/octet-stream, text), 1.61 KiB.
[6 Jan 2009 1:33]
Alexey Stroganov
Found one more query that became slower on 40% due to using MRR in the execution plan: query: select bench1.* from bench1 where id in (1,2,3,4,5,6,7,8,9,10); table definition: the same as and for issues above 6.0.8 ----- mysql> explain select bench1.* from bench1 where id in (1,2,3,4,5,6,7,8,9,10); +----+-------------+--------+-------+---------------+---------+---------+------+--------+-------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+-------+---------------+---------+---------+------+--------+-------------+ | 1 | SIMPLE | bench1 | range | PRIMARY | PRIMARY | 4 | NULL | 300000 | Using where | +----+-------------+--------+-------+---------------+---------+---------+------+--------+-------------+ 1 row in set (0.00 sec) 6.0.9 ----- mysql> explain select bench1.* from bench1 where id in (1,2,3,4,5,6,7,8,9,10); +----+-------------+--------+-------+---------------+---------+---------+------+--------+------------------------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+--------+-------+---------------+---------+---------+------+--------+------------------------+ | 1 | SIMPLE | bench1 | range | PRIMARY | PRIMARY | 4 | NULL | 300000 | Using where; Using MRR | +----+-------------+--------+-------+---------------+---------+---------+------+--------+------------------------+
[8 Jan 2009 14:45]
Alexey Stroganov
Kevin, It looks that despite the fact execution plan has changed in 6.0.9(explain displays 'Using MRR' now) switching on/off MRR feature itself has no impact on performance for Falcon so I think you should re-evaluate this issue: 'MySQL 6.0.8 alpha/' Time for select_range_prefix (1000:3000): 33.072 wallclock secs 'MySQL 6.0.9 alpha/' Time for select_range_prefix (1000:3000): 47.118 wallclock secs 'MySQL 6.0.9 alpha/' with @optimizer_use_mrr='disable' Time for select_range_prefix (1000:3000): 47.234 wallclock secs I will provide simplified test case that should to debug/profile issue.
[12 Jan 2009 12:00]
Sergey Petrunya
Ranger, if MRR isn't the problem, could you please change the bug synopsis then?
[14 Jan 2009 13:17]
Alexey Stroganov
Kevin, I have to apologize for confusion. Due to silly mistake in the test script optimizer_use_mrr option was handled incorrectly so this leaded to wrong conclusion. I've rerun test for the last query mentioned in this bug report and found out that mrr affects performance and number of Handler_read_next is significantly differs between cases when mrr is enabled and disabled. with mrr: time: 106.662 Handler_read_next: 131072000 without mrr: time: 85.2591 Handler_read_next: 30000 See details below: #WITH MRR perl bug_select_mrr.pl --db-socket=/tmp/609.sock --select_in --db-engine="FALCON" --mrr_mode=force MySQL 6.0.9 alpha, ENGINE: FALCON Inner table size: 10 SET mode=force optimizer_use_mrr=force QUERY:SELECT bench1.* FROM bench1 WHERE id IN (1,2,3,4,5,6,7,8,9,10) init values: Testing SELECT ... WHERE id in (10 values) end values: Handler_read_next: 131072000 Time for select_in (1000:10000): 106.662 wallclock secs #WITHOUT MRR perl bug_select_mrr.pl --db-socket=/tmp/609.sock --select_in --db-engine="FALCON" --mrr_mode=disable MySQL 6.0.9 alpha, ENGINE: FALCON Inner table size: 10 SET mode=disable optimizer_use_mrr=disable QUERY:SELECT bench1.* FROM bench1 WHERE id IN (1,2,3,4,5,6,7,8,9,10) init values: Testing SELECT ... WHERE id in (10 values) end values: Handler_read_next: 30000 Time for select_in (1000:10000): 85.2591 wallclock secs I will attach updated script that will help to simplify process of preparing data and running affected queries. #to load initial data run script with --create option perl bug_select_mrr.pl --db-socket=/tmp/609.sock --db-engine="FALCON" --create #to run select_in query perl bug_select_mrr.pl --db-socket=/tmp/609.sock --db-engine="FALCON" --select_in #to enable/disable mrr use --mode_mrr=(disable|force) perl bug_select_mrr.pl --db-socket=/tmp/609.sock --db-engine="FALCON" --select_in --mode_mrr=disable #to get handler stat for query use --db-stat option perl bug_select_mrr.pl --db-socket=/tmp/609.sock --db-engine="FALCON" --select_in --mode_mrr=disable --db-stat
[14 Jan 2009 13:21]
Alexey Stroganov
Updated test case for the issue
Attachment: bug_select_mrr_41980.pl (application/octet-stream, text), 9.42 KiB.
[14 Jan 2009 13:36]
Sergey Petrunya
I'm experimenting with this query: mysql> SELECT bench1.* FROM bench1 WHERE id IN (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159,160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175,176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207,208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223,224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239,240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255,256,257,258,259,260,261,262,263,264,265,266,267,268,269,270,271,272,273,274,275,276,277,278,279,280,281,282,283,284,285,286,287,288,289,290,291,292,293,294,295,296,297,298,299,300,301,302,303,304,305,306,307,308,309,310,311,312,313,314,315,316,317,318,319,320,321,322,323,324,325,326,327,328,329,330,331,332,333,334,335,336,337,338,339,340,341,342,343,344,345,346,347,348,349,350,351,352,353,354,355,356,357,358,359,360,361,362,363,364,365,366,367,368,369,370,371,372,373,374,375,376,377,378,379,380,381,382,383,384,385,386,387,388,389,390,391,392,393,394,395,396,397,398,399,400,401,402,403,404,405,406,407,408,409,410,411,412,413,414,415,416,417,418,419,420,421,422,423,424,425,426,427,428,429,430,431,432,433,434,435,436,437,438,439,440,441,442,443,444,445,446,447,448,449,450,451,452,453,454,455,456,457,458,459,460,461,462,463,464,465,466,467,468,469,470,471,472,473,474,475,476,477,478,479,480,481,482,483,484,485,486,487,488,489,490,491,492,493,494,495,496,497,498,499,500,501,502,503,504,505,506,507,508,509,510,511,512,513,514,515,516,517,518,519,520,521,522,523,524,525,526,527,528,529,530,531,532,533,534,535,536,537,538,539,540,541,542,543,544,545,546,547,548,549,550,551,552,553,554,555,556,557,558,559,560,561,562,563,564,565,566,567,568,569,570,571,572,573,574,575,576,577,578,579,580,581,582,583,584,585,586,587,588,589,590,591,592,593,594,595,596,597,598,599,600,601,602,603,604,605,606,607,608,609,610,611,612,613,614,615,616,617,618,619,620,621,622,623,624,625,626,627,628,629,630,631,632,633,634,635,636,637,638,639,640,641,642,643,644,645,646,647,648,649,650,651,652,653,654,655,656,657,658,659,660,661,662,663,664,665,666,667,668,669,670,671,672,673,674,675,676,677,678,679,680,681,682,683,684,685,686,687,688,689,690,691,692,693,694,695,696,697,698,699,700,701,702,703,704,705,706,707,708,709,710,711,712,713,714,715,716,717,718,719,720,721,722,723,724,725,726,727,728,729,730,731,732,733,734,735,736,737,738,739,740,741,742,743,744,745,746,747,748,749,750,751,752,753,754,755,756,757,758,759,760,761,762,763,764,765,766,767,768,769,770,771,772,773,774,775,776,777,778,779,780,781,782,783,784,785,786,787,788,789,790,791,792,793,794,795,796,797,798,799,800,801,802,803,804,805,806,807,808,809,810,811,812,813,814,815,816,817,818,819,820,821,822,823,824,825,826,827,828,829,830,831,832,833,834,835,836,837,838,839,840,841,842,843,844,845,846,847,848,849,850,851,852,853,854,855,856,857,858,859,860,861,862,863,864,865,866,867,868,869,870,871,872,873,874,875,876,877,878,879,880,881,882,883,884,885,886,887,888,889,890,891,892,893,894,895,896,897,898,899,900,901,902,903,904,905,906,907,908,909,910,911,912,913,914,915,916,917,918,919,920,921,922,923,924,925,926,927,928,929,930,931,932,933,934,935,936,937,938,939,940,941,942,943,944,945,946,947,948,949,950,951,952,953,954,955,956,957,958,959,960,961,962,963,964,965,966,967,968,969,970,971,972,973,974,975,976,977,978,979,980,981,982,983,984,985,986,987,988,989,990,991,992,993,994,995,996,997,998,999,1000);
[14 Jan 2009 13:38]
Sergey Petrunya
Handler_% counter increments with MRR: | Handler_commit | 1 | | Handler_read_next | 131072 | without MRR: | Handler_commit | 1 | | Handler_read_next | 3000 | neither of the values seems to be correct.
[14 Jan 2009 13:40]
Sergey Petrunya
For non-MRR case, wrong counter values (3K increments while retrieving 1K ranges with 1K records each) is caused by the following: ha_falcon::index_next_same() calls ha_falcon::index_next(). Both of them have the ha_statistic_increment(&SSV::ha_read_next_count); line at the start which causes counter to be incremented twice for index_next_same() calls.
[14 Jan 2009 13:42]
Sergey Petrunya
For MRR case: On the second entry into IndexRootPage::scanIndex(), it puts 131K record number bits into the bitmap (while the query can't have >1K results). This is the cause of wrong counter values and most likely the cause of the slowdown.
[14 Jan 2009 13:47]
Sergey Petrunya
Checking if MRR ships correct index bounds down into IndexRootPage::scanIndex: examining the first two ranges in MRR and non-MRR scans: ==== Without MRR === Breakpoint 4, IndexRootPage::scanIndex (dbb=0xb6889818, indexId=10, rootPage=220, lowKey=0xb6becc54, highKey=0xb6bef6a4, searchFlags=1, transId=0, bitmap=0xb6885308) at IndexRootPage.cpp:371 (gdb) p *start_key $66 = {key = 0x9f83a30 "\001", length = 4, keypart_map = 1, flag = HA_READ_KEY_EXACT} (gdb) p *end_key $67 = {key = 0x9f83a38 "\001", length = 4, keypart_map = 1, flag = HA_READ_AFTER_KEY} $59 = {_vptr.IndexKey = 0x8b69e40, index = 0xb68a0780, keyLength = 3, recordNumber = 0, key = "\002¿ð@", 'Ì' <repeats 10805 times>} (gdb) p *highKey $60 = {_vptr.IndexKey = 0x8b69e40, index = 0xb68a0780, keyLength = 3, recordNumber = 0, key = "\002¿ð@", 'Ì' <repeats 10805 times>} (gdb) x/4c lowKey.key 0xb6becc64: 2 '\002' -65 '¿' -16 'ð' 64 '@' (gdb) x/4c highKey.key 0xb6bef6b4: 2 '\002' -65 '¿' -16 'ð' 64 '@' Breakpoint 4, IndexRootPage::scanIndex (dbb=0xb6889818, indexId=10, rootPage=220, lowKey=0xb6becc54, highKey=0xb6bef6a4, searchFlags=1, transId=0, bitmap=0xb6885308) at IndexRootPage.cpp:371 (gdb) p *start_key $64 = {key = 0x9f83a58 "\002", length = 4, keypart_map = 1, flag = HA_READ_KEY_EXACT} (gdb) p *end_key $65 = {key = 0x9f83a60 "\002", length = 4, keypart_map = 1, flag = HA_READ_AFTER_KEY} (gdb) p *highKey $62 = {_vptr.IndexKey = 0x8b69e40, index = 0xb68a0780, keyLength = 2, recordNumber = 0, key = "\002Àð@", 'Ì' <repeats 10805 times>} (gdb) p *lowKey $63 = {_vptr.IndexKey = 0x8b69e40, index = 0xb68a0780, keyLength = 2, recordNumber = 0, key = "\002Àð@", 'Ì' <repeats 10805 times>} (gdb) x/4c lowKey.key 0xb6becc64: 2 '\002' -64 'À' -16 'ð' 64 '@' (gdb) x/4c highKey.key 0xb6bef6b4: 2 '\002' -64 'À' -16 'ð' 64 '@' === With MRR === (gdb) p * startKey $70 = {key = 0x9f83a30 "\001", length = 4, keypart_map = 1, flag = HA_READ_KEY_EXACT} (gdb) p * endKey $71 = {key = 0x9f83a38 "\001", length = 4, keypart_map = 1, flag = HA_READ_AFTER_KEY} Breakpoint 4, IndexRootPage::scanIndex (dbb=0xb6889818, indexId=10, rootPage=220, lowKey=0xb6becc54, highKey=0xb6bef6a4, searchFlags=1, transId=0, bitmap=0xb6885308) at IndexRootPage.cpp:371 (gdb) p *lowKey $72 = {_vptr.IndexKey = 0x8b69e40, index = 0xb68a0780, keyLength = 3, recordNumber = 0, key = "\002¿ð@", 'Ì' <repeats 10805 times>} (gdb) p *highKey $73 = {_vptr.IndexKey = 0x8b69e40, index = 0xb68a0780, keyLength = 3, recordNumber = 0, key = "\002¿ð@", 'Ì' <repeats 10805 times>} (gdb) x/4c lowKey.key 0xb6becc64: 2 '\002' -65 '¿' -16 'ð' 64 '@' (gdb) x/4c highKey.key 0xb6bef6b4: 2 '\002' -65 '¿' -16 'ð' 64 '@' (gdb) c Breakpoint 4, IndexRootPage::scanIndex (dbb=0xb6889818, indexId=10, rootPage=220, lowKey=0xb6becc54, highKey=0xb6bef6a4, searchFlags=1, transId=0, bitmap=0xb6885308) at IndexRootPage.cpp:371 (gdb) p *lowKey $74 = {_vptr.IndexKey = 0x8b69e40, index = 0xb68a0780, keyLength = 2, recordNumber = 0, key = "\002Àð@", 'Ì' <repeats 10805 times>} (gdb) p *highKey $75 = {_vptr.IndexKey = 0x8b69e40, index = 0xb68a0780, keyLength = 2, recordNumber = 0, key = "\002Àð@", 'Ì' <repeats 10805 times>} (gdb) x/4c lowKey.key 0xb6becc64: 2 '\002' -64 'À' -16 'ð' 64 '@' (gdb) x/4c highKey.key 0xb6bef6b4: 2 '\002' -64 'À' -16 'ð' 64 '@' The parameters seem to be the same. Nevertheless, in MRR case, second invocation of IndexRootPage::scanIndex puts 131K bits into the bitmap. in non-MRR it puts, as expected, only one. Perhaps MRR isn't cleaning something after one range scan before the other but I don't understand what it is.
[15 Jan 2009 17:12]
Sergey Petrunya
Discovered an odd thing in Falcon w/o MRR, reported it as BUG#42136. Waiting for that to be resolved before we can proceed with this bug.
[1 Mar 2009 17:46]
Sergey Petrunya
With regards to why do we have (see previous comments): without MRR: | Handler_commit | 1 | | Handler_read_next | 3000 | it's another issue, reported it as BUG#43293.
[1 Mar 2009 18:26]
Bugs System
A patch for this bug has been committed. After review, it may be pushed to the relevant source trees for release in the next version. You can access the patch from: http://lists.mysql.com/commits/67939 2726 Sergey Petrunia 2009-03-01 BUG#41890: Falcon: New execution plans with MRR cause slowdown for group of queries - Testcase
[1 Mar 2009 18:28]
Sergey Petrunya
With the fix for BUG#42136, this issue is resolved. Committed a patch with testcase.
[3 Mar 2009 16:24]
Sergey Petrunya
With the fix for BUG#42136, this problem doesn't occur anymore. Committed a patch with a testcase.
[20 Apr 2009 15:47]
Bugs System
Pushed into 6.0.11-alpha (revid:sergefp@mysql.com-20090417211236-fy28y9o1w8p4ic9m) (version source revid:sergefp@mysql.com-20090301182607-xglayyk67lwson93) (merge vers: 6.0.11-alpha) (pib:6)
[23 Apr 2009 1:21]
Paul DuBois
Noted in 6.0.10 changelog. For Falcon tables, range queries using an index prefix were slow when Multi-Range Read index scans were disabled.