mirror of
https://github.com/MariaDB/server.git
synced 2025-09-26 19:09:13 +02:00
![]() Introduces NO_INDEX_MERGE and INDEX_MERGE, which control whether or not index merge strategies are used during query optimization. Here is an example query from the tests: SET optimizer_switch='index_merge_intersection=off'; EXPLAIN SELECT /*+ INDEX_MERGE(t1 f4, f2) */ COUNT(*) FROM t1 WHERE f4 = 'h' AND f2 = 2; with the hint in place, the query plan will employ the index_merge intersect strategy (abbreviated EXPLAIN output): type Extra index_merge Using intersect(f2,f4); Using where; Using index The presence of the [NO_]INDEX_MERGE hint overrides the optimizer's choice of keys during the index merge optimization. As we see in the above example, keys f2 and f4 and given and the optimizer will consider only those keys for this query. When the hint is given without any particular keys, as in INDEX_MERGE(table), then all keys are considered. In this case, the cheapest index merge among the keys should be used. When NO_INDEX_MERGE(table) is given, then index merge is disabled for that table. When the hint is given with one or more keys, then only those keys are considered. In the case of NO_INDEX_MERGE, those keys are excluded. This can lead to no merged indexes at all, because there may not be sufficient row-ordered read columns available for consideration. The index merge strategies of intersection, union, and sort union cannot themselves be directly controlled via the hints. In combination with the optimizer switches for the same, the strategy may be indirectly controlled but this is not guaranteed. When the hint directs the optimizer such that insufficient ROR scans are available, thus leading to a situation where the INDEX_MERGE hint cannot be honored, the server will emit a warning to that effect. In the hints module (opt_hints*{cc,h}), this commit adds some index merge-specific functionality to make interpreting hint state at callsites in the optimizer cleaner and more intuitive. Particularly, we add a bit field to the table hints class which indicates the keys that are marked by an [NO_]INDEX_MERGE hint, if present. A new function, index_merge_hint (and associated new helper functions) relies on this field when interpreting index merge hint state for the optimizer. If there are no index merges available prior to attemping to find a suitable union/sort union, then the optimizer will not attempt it. This change results in optimizer trace output which does not include the 'analyzing_index_merge_union' block when there are no merges. Parts of this implementation based on MySQL commit ebcb981807e3d91a64782e89d48e1a25622eafea |
||
---|---|---|
.. | ||
collections | ||
include | ||
lib | ||
main | ||
std_data | ||
suite | ||
asan.supp | ||
CMakeLists.txt | ||
dgcov.pl | ||
lsan.supp | ||
mariadb-stress-test.pl | ||
mariadb-test-run.pl | ||
mtr.out-of-source | ||
purify.supp | ||
README | ||
README-gcov | ||
README.stress | ||
suite.pm | ||
valgrind.supp |
This directory contains test suites for the MariaDB server. To run currently existing test cases, execute ./mysql-test-run in this directory. Some tests are known to fail on some platforms or be otherwise unreliable. In the file collections/smoke_test there is a list of tests that are expected to be stable. In general you do not have to do "make install", and you can have a co-existing MariaDB installation, the tests will not conflict with it. To run the tests in a source directory, you must do "make" first. In Red Hat distributions, you should run the script as user "mysql". The user is created with nologin shell, so the best bet is something like # su - # cd /usr/share/mariadb-test # su -s /bin/bash mysql -c ./mysql-test-run This will use the installed MariaDB executables, but will run a private copy of the server process (using data files within /usr/share/mariadb-test), so you need not start the mysqld service beforehand. You can omit --skip-test-list option if you want to check whether the listed failures occur for you. To clean up afterwards, remove the created "var" subdirectory, e.g. # su -s /bin/bash - mysql -c "rm -rf /usr/share/mariadb-test/var" If tests fail on your system, please read the following manual section for instructions on how to report the problem: https://mariadb.com/kb/en/reporting-bugs If you want to use an already running MySQL server for specific tests, use the --extern option to mysql-test-run. Please note that in this mode, you are expected to provide names of the tests to run. For example, here is the command to run the "alias" and "analyze" tests with an external server: # mariadb-test-run --extern socket=/tmp/mysql.sock alias analyze To match your setup, you might need to provide other relevant options. With no test names on the command line, mysql-test-run will attempt to execute the default set of tests, which will certainly fail, because many tests cannot run with an external server (they need to control the options with which the server is started, restart the server during execution, etc.) You can create your own test cases. To create a test case, create a new file in the main subdirectory using a text editor. The file should have a .test extension. For example: # xemacs t/test_case_name.test In the file, put a set of SQL statements that create some tables, load test data, and run some queries to manipulate it. Your test should begin by dropping the tables you are going to create and end by dropping them again. This ensures that you can run the test over and over again. If you are using mysqltest commands in your test case, you should create the result file as follows: # mariadb-test-run --record test_case_name or # mariadb-test --record < t/test_case_name.test If you only have a simple test case consisting of SQL statements and comments, you can create the result file in one of the following ways: # mariadb-test-run --record test_case_name # mariadb test < t/test_case_name.test > r/test_case_name.result # mariadb-test --record --database test --result-file=r/test_case_name.result < t/test_case_name.test When this is done, take a look at r/test_case_name.result. If the result is incorrect, you have found a bug. In this case, you should edit the test result to the correct results so that we can verify that the bug is corrected in future releases. If you want to submit your test case you can send it to developers@lists.mariadb.org or attach it to a bug report on http://mariadb.org/jira/. If the test case is really big or if it contains 'not public' data, then put your .test file and .result file(s) into a tar.gz archive, add a README that explains the problem, ftp the archive to ftp://ftp.mariadb.org/private and submit a report to https://mariadb.org/jira about it. The latest information about mysql-test-run can be found at: https://mariadb.com/kb/en/mariadb/mysqltest/ If you want to create .rdiff files, check https://mariadb.com/kb/en/mariadb/mysql-test-auxiliary-files/