Improvements to ORDER BY Optimization
The fixes were made as a response to complaints by MariaDB customers, so they fix real-world optimization problems. The fixes are a bit hard to describe (as the
ORDER BY optimizer is complicated), but here's a short description:
- Doesn’t make stupid choices when several multi-part keys and potential range accesses are present (MDEV-6402).
- This also fixes MySQL Bug#12113.
- Always uses “range” and (not full “index” scan) when it switches to an index to satisfy
ORDER BY … LIMIT(MDEV-6657).
- Tries hard to be smart and use cost/number of records estimates from other parts of the optimizer (MDEV-6384, MDEV-465).
- This change also fixes MySQL Bug#36817.
- Takes full advantage of InnoDB’s Extended Keys feature when checking if filesort() can be skipped (MDEV-6796).
Starting from MariaDB 10.1.15
- The ORDER BY optimizer takes multiple-equalities into account (MDEV-8989). This optimization is not enabled by default in MariaDB 10.1. You need to explicitly switch it ON by setting the optimizer_switch system variable, as follows:
Comparison with MySQL 5.7
In MySQL 5.7 changelog, one can find this passage:
Make switching of index due to small limit cost-based (WL#6986) : We have made the decision in make_join_select() of whether to switch to a new index in order to support "ORDER BY ... LIMIT N" cost-based. This work fixes Bug#73837.
MariaDB is not using Oracle's fix (we believe
make_join_select is not the right place to do ORDER BY optimization), but the effect is the same: this case is covered by MariaDB 10.1's optimizer.