ORDER BY A*B 的 MySQL 索引

标签 mysql sorting query-optimization innodb

我有一个 MySQL InnoDB 表,其中有两个 INT 列,比如 col1col2。我想添加一个索引,使我能够: 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/

相关文章:

mysql - 加快分组速度

php - 如果列位于另一列中,MYSQL 显示结果就像

php - 高效的mysql数据库结构建议

c# - 如何在 C# 中对哈希集的坐标进行排序

javascript - JS按数组中的 "x"排序对象

sql - 雅典娜 : Query exhausted resources at scale factor

MySQL删除除一个

mysql - 在 Laravel 中将 sql 案例应用于全选

python - Python 3 中的排序函数

mysql - 优化mysql NOT IN查询