mysql - 在 mysql 中按列排序并使用索引的最佳方法是什么?

标签 mysql optimization indexing

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

相关文章:

php - php/mysql 邮件程序帮助

c++ - 在 Release模式下,代码行为不如预期

ruby-on-rails-3 - 是否可以更改 Rails 3 迁移中的列索引?

mysql - 优化包含 'or'的sql查询

sql - Postgres 索引统计

mysql - 在两台计算机之间同步mySQL数据库

java - 使用 Java 加速对 MySQL 的查询调用

mysql - 如何从 Rails 3 中的 Stripe gem 捕获 Web hook?

java - 为什么这种并行矩阵加法效率如此低下?

mysql - 优化 1.5m 条记录的 mysql 表,其中大部分被软删除