ORDER BY A * B的MySQL索引

时间:2014-08-10 09:09:46

标签: mysql sorting query-optimization innodb

我有一个包含两个INT列的MySQL InnoDB表,比如col1col2。我想添加一个索引,允许我: SELECT * from myTable WHERE col0=5 ORDER BY col1*col2 DESC
是否可以有一个支持这种排序的索引,或者我需要添加一个保留该值的列(col1*col2)?

2 个答案:

答案 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