我有一个 MySQL InnoDB 表,其中有两个 INT
列,比如 col1
和 col2
。我想添加一个索引,使我能够:
SELECT * from myTable WHERE col0=5 ORDER BY col1*col2 DESC
是否可能有一个支持这种排序的索引,或者我是否需要添加一个保留该值的列 (col1*col2
)?
最佳答案
Noam,参见 ORDER BY Optimization .如果要使用索引进行排序,它应该与 WHERE 子句中使用的索引相同,当然排序的值需要存储在它自己的列中。 Here I generated a test table with 100k rows ,这应该符合您的情况。
1.) 在两列上添加ONE INDEX(这适用于为选择和排序使用索引):
ALTER TABLE `test_data` ADD INDEX super_sort (`col0`,`sort_col`);
EXPLAIN SELECT * FROM `test_data` WHERE col0 = 50 ORDER BY sort_col;
键-> super_sort;额外 -> 使用哪里 (索引用于WHERE和SORT)
2.) 添加两个索引,一个用于 WHERE,一个用于 SORT(不起作用)
ALTER TABLE `test_data` DROP INDEX `super_sort`;
ALTER TABLE `test_data` ADD INDEX (`col0`);
ALTER TABLE `test_data` ADD INDEX (`sort_col`);
EXPLAIN SELECT * FROM `test_data` WHERE col0 = 50 ORDER BY sort_col;
键-> col0; Extra -> Using where;使用文件排序 (索引用于 WHERE,但不用于排序)
所以答案是:是的,您将需要一个列来保留该值 (col1*col2)
并且您需要在两列上使用一个索引:col0
(对于 WHERE 子句)+ sort_col
(用于排序)就像第一个例子一样。一旦您ORDER BY
任何计算(例如col1*col2
),就没有索引可以用于排序。
关于ORDER BY A*B 的 MySQL 索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25227136/