选项 #1:如果您仅限于 MySQL,则没有更好的选择,而是为可能的顺序列创建 8 个索引。您插入/更新肯定会受到影响,但没有真正的访问者会等待 3.5 分钟才能对列表进行排序。
调整 #1:为了让它更快一点,您可以创建部分索引而不是标准索引,这将使用更少的空间(我假设其中一些列是 varchar),这意味着更少的写入,更小的内存占用。您只需要使用子字符串检查每一列的熵,并确保您仍然有超过 90% 的区别。
例如,使用这样的查询:
> select count(distinct(substring(COLUMN, 1, 5))) as part_5, count(distinct(substring(COLUMN, 1, 10))) as part_10, count(distinct(substring(COLUMN, 1, 20))) as part_20, count(distinct(COLUMN)) as sum from TABLE;
+--------+---------+---------+---------+
| part_5 | part_10 | part_20 | sum |
+--------+---------+---------+---------+
| 892183 | 1996053 | 1996058 | 1996058 |
+--------+---------+---------+---------+
调整 #2:您可以让插入/更新语句在后台执行。应用程序不会更快,但用户体验会更好。
调整#3:如果可以的话,使用更大的事务进行插入/更新。
选项#2:您也可以尝试使用为这种使用模式构建的搜索引擎之一。我会推荐Solr,因为我使用了一段时间后非常满意,但我也听说过弹性搜索。