我有一个包含 10 列的表格,现在我想为用户提供一个选项,让他们可以使用他们想要的任何列对数据进行排序。例如,假设一个组合框有 7 个项目,每个项目都是表格的一列,现在用户选择一个项目并获取按所选列排序的数据。
现在有什么问题?
我的表有 3M 条记录,如果我使用索引列对数据进行排序,我没有问题,但使用非索引列排序需要 3.5 分钟!!!
我正在考虑的解决方案是什么?
为需要排序的表的每一列添加索引!在我的例子中,我将在 8 列上建立索引!!!!
我的解决方案有什么问题?
在列上有很多索引可能会降低 INSERT/UPDATE 查询的速度!在我的例子中,表格经常更新(每秒!!!!!)
对于这种情况,您的解决方案是什么?!
最佳答案
有关优化的更多详细信息,请阅读:http://dev.mysql.com/doc/refman/5.0/en/order-by-optimization.html
在某些情况下,MySQL 不能使用索引来解析ORDER BY
,尽管它仍然使用索引来查找与WHERE
子句匹配的行。使用索引进行排序通常与使用索引查找行一起使用,但是它也可以仅用于排序,例如,如果您只是在表上使用 ORDER BY
而没有 where 子句。在这种情况下,您会在 EXPLAIN
中看到“Index”类型,它对应于按索引顺序扫描(可能)完整的表。了解在哪些条件下可以使用索引对数据进行排序以及限制行数非常重要。
查看相同的索引 (A,B) 之类的东西 ORDER BY A ;按 A、B 订购; ORDER BY A DESC, B DESC
将可以使用全索引进行排序(注意,如果您对全表进行无限制排序,MySQL 可能不会选择使用索引进行排序)。但是 ORDER BY B
或 ORDER BY A, B DESC
将无法使用索引,因为请求的顺序与 BTREE 中数据的顺序不一致。如果您同时具有限制和排序功能,那么这样就可以了 A=5 ORDER BY B ; A=5 按 B 降序排序; A>5 按 A 排序; A>5 按 A,B 排序; A>5 ORDER BY A DESC
这同样可以很容易地可视化为扫描 BTREE 中的一个范围。然而这样的事情是行不通的 A>5 ORDER BY B , A>5 ORDER BY A,B DESC or A IN (3,4) ORDER BY B
– 在这些情况下以排序形式获取数据在 BTREE 中需要的不仅仅是简单的范围扫描,MySQL 决定将其传递下去。
关于mysql - 在 mysql 中按列排序并使用索引的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12686182/