php - 按查询排序花费太多时间

标签 php mysql sql

我有 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/

相关文章:

javascript - 在 PHP 代码中调用 JS 函数

javascript - 存档/循环页面上的 Woocommerce 产品倒计时

php - 在 url mod_rewrite 中隐藏扩展名 .php

python - PostgreSQL - 无法创建表 - 数据类型点没有访问方法 "btree"的默认运算符类

php - 按单词出现的次数对 mysql 搜索结果进行排序

php - 小型 php 框架建议

mysql - 写入一般查询日志 : In file or Mysql Table 的性能更好

php - 在 PHP wordpress 中的一个查询中进行双重 MySQL 查询

Python 和 MySQLDB 连接到网络上的另一台服务器

sql - 将查询转换为SQL Server语法