1set @save_rand_seed1= @@RAND_SEED1; 2set @save_rand_seed2= @@RAND_SEED2; 3set @@RAND_SEED1=810763568, @@RAND_SEED2=600681772; 4create table t1(a int); 5insert into t1 select seq from seq_1_to_10000 order by rand(),seq; 6# 7# parameters: 8# mean mean for the column to be considered 9# max_val max_value for the column to be considered 10# 11# This function generate a sample of a normal distribution 12# This function return a point 13# of the normal distribution with a given mean. 14# 15CREATE FUNCTION 16generate_normal_distribution_sample(mean DOUBLE, max_val DOUBLE)RETURNS DOUBLE 17BEGIN 18DECLARE z DOUBLE DEFAULT 0; 19SET z= (rand() + rand() + rand() + rand() + rand() + rand())/6; 20SET z= 2*(max_val-mean)*z; 21SET z= z + mean - (max_val-mean); 22return z; 23END| 24# 25# parameters: 26# len length of the random string to be generated 27# 28# This function generates a random string for the length passed 29# as an argument with characters in the range of [A,Z] 30# 31CREATE FUNCTION generate_random_string(len INT) RETURNS varchar(128) 32BEGIN 33DECLARE str VARCHAR(256) DEFAULT ''; 34DECLARE x INT DEFAULT 0; 35WHILE (len > 0) DO 36SET x =round(rand()*25); 37SET str= CONCAT(str, CHAR(65 + x)); 38SET len= len-1; 39END WHILE; 40RETURN str; 41END| 42# 43# parameters: 44# mean mean for the column to be considered 45# min_val min_value for the column to be considered 46# max_val max_value for the column to be considered 47# 48# This function generate a normal distribution sample in the range of 49# [min_val, max_val] 50# 51CREATE FUNCTION 52clipped_normal_distribution(mean DOUBLE, min_val DOUBLE, max_val DOUBLE) 53RETURNS INT 54BEGIN 55DECLARE r DOUBLE DEFAULT 0; 56WHILE 1=1 DO 57set r= generate_normal_distribution_sample(mean, max_val); 58IF (r >= min_val AND r <= max_val) THEN 59RETURN round(r); 60end if; 61END WHILE; 62RETURN 0; 63END| 64create table t2 (id INT NOT NULL, a INT, b int); 65insert into t2 66select a, clipped_normal_distribution(12, 0, 64), 67clipped_normal_distribution(32, 0, 128) 68from t1; 69CREATE TABLE t3( 70id INT NOT NULL, 71names VARCHAR(64), 72address VARCHAR(128), 73PRIMARY KEY (id) 74); 75# 76# table t3 stores random strings calculated from the length stored in 77# table t2 78# 79insert into t3 80select id, generate_random_string(a), generate_random_string(b) from t2; 81# 82# All records fit in memory 83# 84set sort_buffer_size=262144*10; 85analyze format=json select id DIV 100 as x, 86MD5(group_concat(substring(names,1,3), substring(address,1,3) 87order by id)) 88FROM t3 89GROUP BY x; 90ANALYZE 91{ 92 "query_block": { 93 "select_id": 1, 94 "r_loops": 1, 95 "r_total_time_ms": "REPLACED", 96 "read_sorted_file": { 97 "r_rows": 10000, 98 "filesort": { 99 "sort_key": "t3.`id` DIV 100", 100 "r_loops": 1, 101 "r_total_time_ms": "REPLACED", 102 "r_used_priority_queue": false, 103 "r_output_rows": 10000, 104 "r_buffer_size": "REPLACED", 105 "r_sort_mode": "sort_key,packed_addon_fields", 106 "table": { 107 "table_name": "t3", 108 "access_type": "ALL", 109 "r_loops": 1, 110 "rows": 10000, 111 "r_rows": 10000, 112 "r_table_time_ms": "REPLACED", 113 "r_other_time_ms": "REPLACED", 114 "filtered": 100, 115 "r_filtered": 100 116 } 117 } 118 } 119 } 120} 121flush status; 122select id DIV 100 as x, 123MD5(group_concat(substring(names,1,3), substring(address,1,3) 124order by id)) 125FROM t3 126GROUP BY x; 127x MD5(group_concat(substring(names,1,3), substring(address,1,3) 128order by id)) 1290 3d24cb0237caf81aa74a2dddf367ac23 1301 618f9b8b6cefaa268dcb5477eece5e90 1312 fbfe93cc7713f852852f66e578d999aa 1323 34802712af9c95664f41e789d19fb6e7 1334 2d9a4d628013b45cea5301143ec559c5 1345 324b8e682ad2233498f36979fddddf30 1356 31ccc1ab69c00dcade71f7fda2fad599 1367 e059e0279a5654a1c5f6596d220691bf 1378 a21e5021cfb19be280f7fa2c2e70608e 1389 6230b389a5bb0f9cd464b839e8824d0d 13910 f2db66b6c4ad49e406f965a80ff5d224 14011 75f39127d968cad28d30707889191d81 14112 2e75191c0f32966a9e7675d0ddcf1c1c 14213 808b4ecabb9cbb40ff3549c81b21d2f5 14314 c7c0c0bbf0ab7558793a86eaca714a3f 14415 3065d81035dc9c596bc235ab553f92de 14516 13b1b17e93649fe49d6da356c2072c63 14617 e3ce0af10608e6467ba4d38b135ff873 14718 0f172b310ad772e13630b647e09ef79a 14819 26bbfb77888fa151215fe8ff75e448e7 14920 fcd6d5113e8178766dc370b470eb053a 15021 d3860a17be6da02e17432f2ff80a261f 15122 1d0cb7cd3f54c15bd41491e6fa449f12 15223 15f95be2574a94677fa7e76ead23e025 15324 924abdbb21c79cc7fd11d4d5b87ac339 15425 7493978704b5223a4f5dc6d8beb51d90 15526 f4ac4696b05577ba4a05334cd131cf94 15627 cfd45d4915f342978fb6982a825f6cc2 15728 2bd8981c6245c32ea1dc27ef394df94e 15829 0e47838fe4be239939424fcef1289002 15930 18e291b42da10b04434bdad010a5b66c 16031 cbd1bf2554378ef7edd9087d4a8562d4 16132 ddb1e7282bb637f7fe3aa3aed149b482 16233 1963f2400c8870d67f99c391bc5040c2 16334 d2b44d3c13a7a2c83de840892a370f47 16435 7ff20517acf5ea901757262eae1edf5e 16536 685fbfc47faad4243944d7331a2dee36 16637 9d58b82b5f9d369a16c4f2bcc424b412 16738 be15aa080dda65c9489892c34a330c30 16839 4b52ddf7b599c9a00d094008a464c18c 16940 441b03789e58aec883138d9c657a005e 17041 e76cc7b1cadcb4f31e0232a0a8458620 17142 3581a040fbf210f6942fe591621f0e41 17243 acc552d3cba6a900054093c3c6876fc5 17344 fd7fa7a0a4a58485a1aa30e804f024af 17445 56afedd4f2e8101fbb4402051e9857e8 17546 019e4178eccbdd84150f196668e40888 17647 132c8e314dd7c9064e1cb4980856531c 17748 dcc08184bf2f7cfb640af0c603ff7506 17849 691b29183f64480003f8a1a74cd3ac13 17950 105da23f1b4a63d755414beca9df20d5 18051 30b2e973a0186721f9a7720be6be09e5 18152 b307d14c06fd6f27173d683a5596b542 18253 2125a788f107a4ba6a364984f7145156 18354 aa0793982ae401cd2c1bea949d726ae1 18455 e1797ba6b7ecf5f84cda2703f79c878c 18556 78fc3f94127c0d5c6b3fa82ac3a8c167 18657 b8c6d1e26cfd94aade5e32cf89e05da6 18758 1e3481d6ff3b22f6ad739b93afe4c341 18859 59e9d5be4a87ee707578a3a8e5d624e9 18960 7a00e357826e950ffbe688c3f9a99a97 19061 e5a8c0d404f6fb59d9e3dd88b13ba5a7 19162 19d22c20fbf76b5b9ac746679ade26e7 19263 c96f912f54b9b862532ce959398c76ca 19364 86c167171b777a150356f1f083203d24 19465 e1bca8d6cc1904a919cce1090e62f34d 19566 f5dd3f6267376875239222dbefac87b1 19667 d6a2aa26124dd42a9df9fa21b7eb8bce 19768 ecd36ba9a56f89d4bf6fa83c2b800985 19869 87b64475fd3f4db6dd68a45fb9a825dc 19970 f5f7aa5569558b3e6556c72c9dfc429b 20071 9e1cc67e0c13d00c771b6bed2fd566cf 20172 3a6e7c6ce76a04fa2503d094121d84d5 20273 5fd8ba2dd8d36814d06a1d278002e437 20374 10db883700dde7289eb640df3a6d6676 20475 3ebd59ed119d6dfda3eedc5bf05fd425 20576 5008d3ce585f3b2dda2b313c57ebcb0a 20677 ac7cee33e39827de02acedb7584acae5 20778 3f440facefbd95f905942c75bfe60bbb 20879 89639b3145c988c775d9d997c9d356ff 20980 a6f8b29a83b2305188c241f2724ea998 21081 d79f9bd47505cee69627e8044f7745c2 21182 5f8d8b55bc9d5b44f817ada0b9bab2f7 21283 411a99ef2e2af45640f0224274979fb5 21384 60706cd1eb7dffae3d7a34133c5cb67e 21485 272a5d09070b5a0569fb18e144100f8b 21586 0f969fd16dd186e9eb099213a82fb119 21687 6c48f63ec50e26ba42d8ca074daee9a6 21788 83512539cc5a2561426564590d307a58 21889 c57cf49bbeaa12aaba2106278681c9cd 21990 d248507181561f0aba09182c4326fb11 22091 a1e153dd8bb1334bccd73890fafc5ba9 22192 d7a0ba2d1241a07abf3691074cecff76 22293 466034794d577c41a9716bc9eb903ee2 22394 b5e2158feb4290b04a7bdfdec0a17976 22495 8a16a27008d033dd6e9074b042021e60 22596 ccaa12e89f6de3058b3a2baddc4eff00 22697 7fdbf02f369546d0fde2b7db85752e33 22798 63b286bb777298397f3acf03fc3e9deb 22899 b271f751a4952f86b002b9730bd02c8b 229100 cbd5cef546acc0bfa33117d7c1ae58a8 230show status like '%sort%'; 231Variable_name Value 232Sort_merge_passes 0 233Sort_priority_queue_sorts 0 234Sort_range 0 235Sort_rows 10000 236Sort_scan 1 237set sort_buffer_size=default; 238# 239# Test for merge_many_buff 240# 241set sort_buffer_size=32768; 242analyze format=json select id DIV 100 as x, 243MD5(group_concat(substring(names,1,3), substring(address,1,3) 244order by id)) 245FROM t3 246GROUP BY x; 247ANALYZE 248{ 249 "query_block": { 250 "select_id": 1, 251 "r_loops": 1, 252 "r_total_time_ms": "REPLACED", 253 "read_sorted_file": { 254 "r_rows": 10000, 255 "filesort": { 256 "sort_key": "t3.`id` DIV 100", 257 "r_loops": 1, 258 "r_total_time_ms": "REPLACED", 259 "r_used_priority_queue": false, 260 "r_output_rows": 10000, 261 "r_sort_passes": 4, 262 "r_buffer_size": "REPLACED", 263 "r_sort_mode": "sort_key,packed_addon_fields", 264 "table": { 265 "table_name": "t3", 266 "access_type": "ALL", 267 "r_loops": 1, 268 "rows": 10000, 269 "r_rows": 10000, 270 "r_table_time_ms": "REPLACED", 271 "r_other_time_ms": "REPLACED", 272 "filtered": 100, 273 "r_filtered": 100 274 } 275 } 276 } 277 } 278} 279flush status; 280select id DIV 100 as x, 281MD5(group_concat(substring(names,1,3), substring(address,1,3) 282order by id)) 283FROM t3 284GROUP BY x; 285x MD5(group_concat(substring(names,1,3), substring(address,1,3) 286order by id)) 2870 3d24cb0237caf81aa74a2dddf367ac23 2881 618f9b8b6cefaa268dcb5477eece5e90 2892 fbfe93cc7713f852852f66e578d999aa 2903 34802712af9c95664f41e789d19fb6e7 2914 2d9a4d628013b45cea5301143ec559c5 2925 324b8e682ad2233498f36979fddddf30 2936 31ccc1ab69c00dcade71f7fda2fad599 2947 e059e0279a5654a1c5f6596d220691bf 2958 a21e5021cfb19be280f7fa2c2e70608e 2969 6230b389a5bb0f9cd464b839e8824d0d 29710 f2db66b6c4ad49e406f965a80ff5d224 29811 75f39127d968cad28d30707889191d81 29912 2e75191c0f32966a9e7675d0ddcf1c1c 30013 808b4ecabb9cbb40ff3549c81b21d2f5 30114 c7c0c0bbf0ab7558793a86eaca714a3f 30215 3065d81035dc9c596bc235ab553f92de 30316 13b1b17e93649fe49d6da356c2072c63 30417 e3ce0af10608e6467ba4d38b135ff873 30518 0f172b310ad772e13630b647e09ef79a 30619 26bbfb77888fa151215fe8ff75e448e7 30720 fcd6d5113e8178766dc370b470eb053a 30821 d3860a17be6da02e17432f2ff80a261f 30922 1d0cb7cd3f54c15bd41491e6fa449f12 31023 15f95be2574a94677fa7e76ead23e025 31124 924abdbb21c79cc7fd11d4d5b87ac339 31225 7493978704b5223a4f5dc6d8beb51d90 31326 f4ac4696b05577ba4a05334cd131cf94 31427 cfd45d4915f342978fb6982a825f6cc2 31528 2bd8981c6245c32ea1dc27ef394df94e 31629 0e47838fe4be239939424fcef1289002 31730 18e291b42da10b04434bdad010a5b66c 31831 cbd1bf2554378ef7edd9087d4a8562d4 31932 ddb1e7282bb637f7fe3aa3aed149b482 32033 1963f2400c8870d67f99c391bc5040c2 32134 d2b44d3c13a7a2c83de840892a370f47 32235 7ff20517acf5ea901757262eae1edf5e 32336 685fbfc47faad4243944d7331a2dee36 32437 9d58b82b5f9d369a16c4f2bcc424b412 32538 be15aa080dda65c9489892c34a330c30 32639 4b52ddf7b599c9a00d094008a464c18c 32740 441b03789e58aec883138d9c657a005e 32841 e76cc7b1cadcb4f31e0232a0a8458620 32942 3581a040fbf210f6942fe591621f0e41 33043 acc552d3cba6a900054093c3c6876fc5 33144 fd7fa7a0a4a58485a1aa30e804f024af 33245 56afedd4f2e8101fbb4402051e9857e8 33346 019e4178eccbdd84150f196668e40888 33447 132c8e314dd7c9064e1cb4980856531c 33548 dcc08184bf2f7cfb640af0c603ff7506 33649 691b29183f64480003f8a1a74cd3ac13 33750 105da23f1b4a63d755414beca9df20d5 33851 30b2e973a0186721f9a7720be6be09e5 33952 b307d14c06fd6f27173d683a5596b542 34053 2125a788f107a4ba6a364984f7145156 34154 aa0793982ae401cd2c1bea949d726ae1 34255 e1797ba6b7ecf5f84cda2703f79c878c 34356 78fc3f94127c0d5c6b3fa82ac3a8c167 34457 b8c6d1e26cfd94aade5e32cf89e05da6 34558 1e3481d6ff3b22f6ad739b93afe4c341 34659 59e9d5be4a87ee707578a3a8e5d624e9 34760 7a00e357826e950ffbe688c3f9a99a97 34861 e5a8c0d404f6fb59d9e3dd88b13ba5a7 34962 19d22c20fbf76b5b9ac746679ade26e7 35063 c96f912f54b9b862532ce959398c76ca 35164 86c167171b777a150356f1f083203d24 35265 e1bca8d6cc1904a919cce1090e62f34d 35366 f5dd3f6267376875239222dbefac87b1 35467 d6a2aa26124dd42a9df9fa21b7eb8bce 35568 ecd36ba9a56f89d4bf6fa83c2b800985 35669 87b64475fd3f4db6dd68a45fb9a825dc 35770 f5f7aa5569558b3e6556c72c9dfc429b 35871 9e1cc67e0c13d00c771b6bed2fd566cf 35972 3a6e7c6ce76a04fa2503d094121d84d5 36073 5fd8ba2dd8d36814d06a1d278002e437 36174 10db883700dde7289eb640df3a6d6676 36275 3ebd59ed119d6dfda3eedc5bf05fd425 36376 5008d3ce585f3b2dda2b313c57ebcb0a 36477 ac7cee33e39827de02acedb7584acae5 36578 3f440facefbd95f905942c75bfe60bbb 36679 89639b3145c988c775d9d997c9d356ff 36780 a6f8b29a83b2305188c241f2724ea998 36881 d79f9bd47505cee69627e8044f7745c2 36982 5f8d8b55bc9d5b44f817ada0b9bab2f7 37083 411a99ef2e2af45640f0224274979fb5 37184 60706cd1eb7dffae3d7a34133c5cb67e 37285 272a5d09070b5a0569fb18e144100f8b 37386 0f969fd16dd186e9eb099213a82fb119 37487 6c48f63ec50e26ba42d8ca074daee9a6 37588 83512539cc5a2561426564590d307a58 37689 c57cf49bbeaa12aaba2106278681c9cd 37790 d248507181561f0aba09182c4326fb11 37891 a1e153dd8bb1334bccd73890fafc5ba9 37992 d7a0ba2d1241a07abf3691074cecff76 38093 466034794d577c41a9716bc9eb903ee2 38194 b5e2158feb4290b04a7bdfdec0a17976 38295 8a16a27008d033dd6e9074b042021e60 38396 ccaa12e89f6de3058b3a2baddc4eff00 38497 7fdbf02f369546d0fde2b7db85752e33 38598 63b286bb777298397f3acf03fc3e9deb 38699 b271f751a4952f86b002b9730bd02c8b 387100 cbd5cef546acc0bfa33117d7c1ae58a8 388show status like '%sort%'; 389Variable_name Value 390Sort_merge_passes 4 391Sort_priority_queue_sorts 0 392Sort_range 0 393Sort_rows 10000 394Sort_scan 1 395set sort_buffer_size=default; 396# 397# CASE #1 Packed sort keys with addon fields 398# 399ALTER TABLE t3 ADD INDEX idx(names, address); 400set sort_buffer_size= 2097152; 401ANALYZE FORMAT=JSON SELECT id, names, address FROM t3 ORDER BY names, address; 402ANALYZE 403{ 404 "query_block": { 405 "select_id": 1, 406 "r_loops": 1, 407 "r_total_time_ms": "REPLACED", 408 "read_sorted_file": { 409 "r_rows": 10000, 410 "filesort": { 411 "sort_key": "t3.`names`, t3.address", 412 "r_loops": 1, 413 "r_total_time_ms": "REPLACED", 414 "r_used_priority_queue": false, 415 "r_output_rows": 10000, 416 "r_buffer_size": "REPLACED", 417 "r_sort_mode": "packed_sort_key,packed_addon_fields", 418 "table": { 419 "table_name": "t3", 420 "access_type": "ALL", 421 "r_loops": 1, 422 "rows": 10000, 423 "r_rows": 10000, 424 "r_table_time_ms": "REPLACED", 425 "r_other_time_ms": "REPLACED", 426 "filtered": 100, 427 "r_filtered": 100 428 } 429 } 430 } 431 } 432} 433flush status; 434SELECT id, names, address INTO OUTFILE '$file1' FROM t3 ORDER BY names, address; 435# Sort_merge_passes should be 0 436show status like '%sort%'; 437Variable_name Value 438Sort_merge_passes 0 439Sort_priority_queue_sorts 0 440Sort_range 0 441Sort_rows 10000 442Sort_scan 1 443SELECT id, names, address INTO OUTFILE '$file2' FROM t3 FORCE INDEX(idx) ORDER BY names, address; 444# 445# CASE #2 Packed sort keys and ROW_ID 446# 447set @save_max_length_for_sort_data=@@max_length_for_sort_data; 448set max_length_for_sort_data= 300; 449set sort_buffer_size= 1097152; 450ANALYZE FORMAT=JSON SELECT id, names, address FROM t3 ORDER BY names, address; 451ANALYZE 452{ 453 "query_block": { 454 "select_id": 1, 455 "r_loops": 1, 456 "r_total_time_ms": "REPLACED", 457 "read_sorted_file": { 458 "r_rows": 10000, 459 "filesort": { 460 "sort_key": "t3.`names`, t3.address", 461 "r_loops": 1, 462 "r_total_time_ms": "REPLACED", 463 "r_used_priority_queue": false, 464 "r_output_rows": 10000, 465 "r_buffer_size": "REPLACED", 466 "r_sort_mode": "packed_sort_key,rowid", 467 "table": { 468 "table_name": "t3", 469 "access_type": "ALL", 470 "r_loops": 1, 471 "rows": 10000, 472 "r_rows": 10000, 473 "r_table_time_ms": "REPLACED", 474 "r_other_time_ms": "REPLACED", 475 "filtered": 100, 476 "r_filtered": 100 477 } 478 } 479 } 480 } 481} 482flush status; 483SELECT id, names, address INTO OUTFILE '$file1' FROM t3 ORDER BY names, address; 484# Sort_merge_passes should be 0 485show status like '%sort%'; 486Variable_name Value 487Sort_merge_passes 0 488Sort_priority_queue_sorts 0 489Sort_range 0 490Sort_rows 10000 491Sort_scan 1 492set @@max_length_for_sort_data=@save_max_length_for_sort_data; 493set @@sort_buffer_size=default; 494set @@RAND_SEED1= @save_rand_seed1; 495set @@RAND_SEED2= @save_rand_seed2; 496drop function generate_normal_distribution_sample; 497drop function generate_random_string; 498drop function clipped_normal_distribution; 499drop table t1, t2, t3; 500