我有 8 万多名客户和 4 个小组。现在我想在 mysql 中找到 2 组用户进行查询。我的查询如下:
select c.customers_firstname as recipient_firstname,
c.customers_lastname as recipient_lastname,
c.customers_id as recipient_id,
c.customers_email_address as recipient_email_address
from customers c
where customers_group_id = '1' OR customers_group_id = '3'
当我在 phpmyadmin 中运行此查询时,我得到了结果:显示行 0 - 29(总共 59,815,查询耗时 0.0034 秒)
但是,当我在此查询中按 ORDER BY recipient_firstname ASC
添加订单时,结果时间为:显示行 0 - 29(总共 59,815,查询耗时 0.2607 秒)
按查询排序的结果花费了太多时间。
我想通过查询减少下单时间。
如果有其他方法可以在更短的时间内获得相同的结果,请提供帮助。
最佳答案
recipient_firstname
字段需要一个索引(实际上是 customers.customers_firstname)。索引允许对结果集进行有序的线性时间迭代。
如果没有索引,结果集必须聚合然后排序。此排序将为 n log n
。这对于大型集合来说显然非常慢,如果它不能放入内存(并且 60k 记录可能不依赖于配置),它将执行非常慢的基于文件的排序。
tl;dr 您需要一个索引。 recipient_firstname
上的索引将使查询的性能非常接近非 ORDER BY
版本。
顺便说一句,如果 customers_group_id 是一个整数字段,请使用整型文字,而不是字符串。它可能不会产生任何影响,但它具有误导性,而且实际上在某些情况下它很重要。
根据情况,可能还值得在组 ID 上放置一个索引。对于小的集合,结果可以在构建集合时过滤,但对于大的结果集,最终将需要相当大的磁盘重载全表扫描。
关于php - 按查询排序花费太多时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19443270/