Server IP : 172.67.216.182 / Your IP : 162.158.88.112 Web Server : Apache System : Linux krdc-ubuntu-s-2vcpu-4gb-amd-blr1-01.localdomain 5.15.0-142-generic #152-Ubuntu SMP Mon May 19 10:54:31 UTC 2025 x86_64 User : www ( 1000) PHP Version : 7.4.33 Disable Function : passthru,exec,system,putenv,chroot,chgrp,chown,shell_exec,popen,proc_open,pcntl_exec,ini_alter,ini_restore,dl,openlog,syslog,readlink,symlink,popepassthru,pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,imap_open,apache_setenv MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : OFF | Sudo : ON | Pkexec : ON Directory : /www/server/mysql/src/mysql-test/suite/opt_trace/t/ |
Upload File : |
# Tests for eq_range_index_dive_limit variable: # test that the number of ranges are counted correctly and # index statistics kicks in when more than # eq_range_index_dive_limit equality ranges are in the # predicate --source include/have_optimizer_trace.inc --source include/have_debug.inc --source include/have_innodb_16k.inc SET optimizer_trace_max_mem_size=1048576; # 1MB SET optimizer_trace="enabled=on,one_line=off"; SET end_markers_in_json="on"; SET eq_range_index_dive_limit=default; SELECT @@eq_range_index_dive_limit; CREATE TABLE t1 ( a INT, b INT, KEY (a,b) ); INSERT INTO t1 VALUES (1,1), (2,2), (3,3); INSERT INTO t1 VALUES (4,1), (4,2), (4,3); INSERT INTO t1 VALUES (5,1), (5,2), (5,3); --replace_column 7 # SHOW INDEX FROM t1; ANALYZE TABLE t1; --replace_column 7 # SHOW INDEX FROM t1; --echo ##### --echo # Apply knowledge about the statistics (each index value for --echo # the first key part has an estimate of 2 rows) to ensure that --echo # index statistics kicks in correctly. --echo ##### --echo # Index dives are done, giving correct estimate of 3 records EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3); SET eq_range_index_dive_limit=3; SELECT @@eq_range_index_dive_limit; # Crash server if records_in_range() is called SET SESSION DEBUG="+d,crash_records_in_range"; --echo # Index statistics kicks in, giving incorrect estimate of 3x2=6 records EXPLAIN SELECT * FROM t1 WHERE a IN (1,2,3); SELECT * FROM t1 WHERE a IN (1,2,3); SET SESSION DEBUG="-d,crash_records_in_range"; --echo ##### --echo # Below: A number of tests to verify that the number of equality ranges --echo # are counted correctly --echo ##### # The limit is 3 --echo --echo # 2 equality ranges: should not use index statistics EXPLAIN SELECT * FROM t1 WHERE a=5 OR a>10 OR a IN (1); SELECT * FROM information_schema.OPTIMIZER_TRACE; # This query will use index statistics (as shown in trace) but # we cannot make it crash if records_in_range() is called # because the "a>10" range will correctly call records_in_range() --echo --echo # 3 equality ranges: should use index statistics EXPLAIN SELECT * FROM t1 WHERE a=5 OR a>10 OR a IN (1,2); SELECT * FROM information_schema.OPTIMIZER_TRACE; # Crash server if records_in_range() is called --echo --echo # 3 equality ranges: should use index statistics SET SESSION DEBUG="+d,crash_records_in_range"; EXPLAIN SELECT * FROM t1 WHERE a=5 AND (b=2 OR b=3 OR b=4); SELECT * FROM information_schema.OPTIMIZER_TRACE; SET SESSION DEBUG="-d,crash_records_in_range"; --echo --echo # 2 equality ranges: should not use index statistics EXPLAIN SELECT * FROM t1 WHERE a=5 AND (b=2 OR b=3 OR b>4); SELECT * FROM information_schema.OPTIMIZER_TRACE; --echo --echo # 2 equality ranges: should not use index statistics EXPLAIN SELECT * FROM t1 WHERE a=5 AND (b=2 OR b=3 OR b IS NULL); SELECT * FROM information_schema.OPTIMIZER_TRACE; --echo --echo # 0 equality ranges: should not use index statistics EXPLAIN SELECT * FROM t1 WHERE a>5 AND (b=2 OR b=3 OR b=4); SELECT * FROM information_schema.OPTIMIZER_TRACE; # Turn index statistics off SET eq_range_index_dive_limit=0; --echo --echo # 1 equality range: should not use index statistics EXPLAIN SELECT * FROM t1 WHERE a=5; SELECT * FROM information_schema.OPTIMIZER_TRACE; DROP TABLE t1; SET eq_range_index_dive_limit=default;