我有一个包含两个INT
列的MySQL InnoDB表,比如col1
和col2
。我想添加一个索引,允许我:
SELECT * from myTable WHERE col0=5 ORDER BY col1*col2 DESC
是否可以有一个支持这种排序的索引,或者我需要添加一个保留该值的列(col1*col2
)?
答案 0 :(得分:2)
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;额外 - > 使用地点;使用filesort (索引用于WHERE,但不用于排序)
所以答案是:是的,您需要一个保持该值(col1*col2)
的列,并且您需要在两列上都有一个索引:col0
(对于WHERE子句)+ {{1第一个例子中的(用于排序)。很快,当您sort_col
任何计算(例如ORDER BY
)时,没有索引可用于排序。
答案 1 :(得分:-1)
您可以添加包含col1*col2
值的新列,并将其用于排序。否则,您可以使用SELECT * from myTable WHERE col0=5 ORDER BY col1*col2 DESC
。