【问题标题】:How to improve a mysql COUNT query for speed?如何提高 mysql COUNT 查询的速度?
【发布时间】:2021-11-17 03:05:12
【问题描述】:

如何提高此查询的速度?目前只需要几秒钟就可以加载查询所在的 php 文件,甚至不需要查询任何内容。

我有一个关于技能趋势、职位和行业的索引。 排序规则:utf8mb4_unicode_ci

$sql = "SELECT 
   COUNT(skillsTrends), 
   skillsTrends,
   jobtitle,
   industry,
   industry_url 
FROM fr_skills_trends 
WHERE industry IN ('". implode("', '", $industryInsertSql). "') 
  AND LENGTH(skillsTrends)<=35 
  AND reg_date >= NOW() - INTERVAL 3 MONTH 
GROUP BY skillsTrends ORDER by LENGTH(skillsTrends) DESC";

记录数

【问题讨论】:

  • 我收到一个错误ERROR 1140 (42000)。这是因为“MySQL 5.7.5及更高版本实现了功能依赖检测。如果启用ONLY_FULL_GROUP_BY SQL模式(默认情况下),”
  • "我有一个关于 ....jobtitle 的索引" 你真的认为这有帮助吗? reg_date &gt;= NOW() - INTERVAL 3 MONTH 呢?这不需要reg_date 上的索引吗?还有LENGTH(skillsTrends)&lt;=35 ?...... BTW:$industryInsertSql 的内容怎么样?
  • 顺便说一句:有人写了一个关于这个主题的章节,请参阅:8.2.1 Optimizing SELECT Statements
  • 感谢您的回复。 $industryInsertSql 是一个类别,例如来自选择选项菜单的会计。在该类别下可能有几千条记录。

标签: php mysql sql count query-optimization


【解决方案1】:

试试这个covering index

CREATE INDEX fr_skills_trends_date_industry 
          ON fr_skills_trends 
             (reg_date , industry, skillsTrends);

它应该有助于提高查询的性能。

而且,您的查询误用了MySQL's notorious nonstandard extension to GROUP BY。试试这个吧。

SELECT 
   COUNT(skillsTrends), 
   skillsTrends,
   jobtitle,
   industry,
   industry_url 
FROM fr_skills_trends 
WHERE industry IN ('". implode("', '", $industryInsertSql). "') 
  AND LENGTH(skillsTrends)<=35 
  AND reg_date >= NOW() - INTERVAL 3 MONTH 
GROUP BY skillsTrends, jobtitle, industry, industry_url
ORDER by LENGTH(skillsTrends) DESC

【讨论】:

  • 非常快,谢谢。正如 Luuk 所提到的,我也即将更新索引。有一件事,我看不出你的查询和我的查询有什么区别,但我已经用过了。
猜你喜欢
  • 1970-01-01
  • 2019-10-09
  • 2021-12-24
  • 2012-03-31
  • 1970-01-01
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多