gpt4 book ai didi

ORDER BY A*B 的 MySQL 索引

转载 作者:行者123 更新时间:2023-11-29 02:59:57 26 4
gpt4 key购买 nike

我有一个 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com