对于特定示例,我如何通过索引或其他方式提高 SQL 性能(在 MYSQL 中)

How can I Improve SQL performance through indexing or other means for a specific example (In MYSQL)

假设我有一个 table 的分数是我根据其他地方的一些数据预先计算的。我希望能够每秒多次搜索此数据以获得前 x 个结果。搜索会对分数进行加权,权重会不断变化。我该怎么做才能加快此查询的速度?我举了一个例子,很好地说明了我将如何做事,减去另一个 table 的外键、更多数据和其他一些(我希望)无关紧要的东西。

USE clashroyale;
DROP TABLE if exists WhosebugExample;
CREATE TABLE WhosebugExample(id int AUTO_INCREMENT, score1 float, score2 float, score3 float, PRIMARY KEY(id));

INSERT INTO WhosebugExample (score1, score2, score3) VALUES(2,1,-1), (1.12,4.2,3.2);
SELECT *, 0.6*score1+0.3*score2+0.1*score3 as weightedScore FROM WhosebugExample ORDER BY weightedScore DESC LIMIT 10;

我认为索引不起作用,因为在完全处理之前不能排除任何行,因此必须处理每一行。

如果权重保持不变,您可以创建一个 stored generated column,以便在您插入数据时计算加权分数。然后在该生成的列上添加索引,以便 ORDER BY 变为 no-op.

但是你说权重不会保持不变。当您 运行 查询时,加权分数的计算方式可能会有所不同。这意味着也没有办法索引排序顺序。创建一个只使用一次的索引没有任何好处;至少构建索引的成本与仅进行一次排序的成本一样高。

我看不到任何进一步优化此查询的方法。如果 运行ning 对您来说不够快,请升级到更快的计算机以 运行 您的数据库。

其他优化需要您重新考虑如何计算加权分数。如果权重是可预测的,也许有一种方法可以预先计算几个不同的权重。或者您可以缓存结果,这样您就不必 运行 如此频繁地查询。