MySQL 查询耗时超过 6 秒

Posted

技术标签:

【中文标题】MySQL 查询耗时超过 6 秒【英文标题】:MySQL Query taking over 6 seconds 【发布时间】:2017-01-14 07:01:28 【问题描述】:

不久前,我在特定查询方面获得了一些帮助。这是链接:SQL Group BY using strings in new columns

我的查询类似于:

SELECT    event_data, class_40_winner, class_30_winner
FROM      events e
LEFT JOIN (SELECT result_event, name AS class_40_winner
       FROM   results 
       WHERE  class = 40 AND position = 1) c40 ON e.id = c40.result_event
LEFT JOIN (SELECT result_event, name AS class_30_winner
       FROM   results 
       WHERE  class = 30 AND position = 1) c30 ON e.id = c30.result_event

我现在已经在我的数据库中输入了足够的数据(22,000 行),这个查询需要 6 多秒才能完成。 (我的实际查询比上面的要大,因为它现在有 4 个连接。)

我在查询中使用了“解释”功能来查看。 “结果”表中的每个查询都提取了 22,000 行,所以这似乎是问题所在。

我已经做了一些研究,听起来我应该能够在“结果”表上对相关列进行索引,以帮助加快速度。但是当我这样做时,它实际上将我的查询减慢到大约 10 秒。

对我可以做些什么来改进这个查询有什么建议吗?

【问题讨论】:

不要做子选择 - 只是加入 此解决方案将数据检索问题与数据显示问题混为一谈。处理应用程序代码中的显示问题。 【参考方案1】:

AFAIK,您正在旋转数据,我认为使用 max(case ...) ... group by 在旋转数据方面具有良好的性能。 我可以建议您改用此查询:

select event_date
    , max(case when r.class = 40 then name end) `Class 40 Winner`
    , max(case when r.class = 30 then name end) `Class 30 Winner`
from events e
left join results r on e.event_id = r.result_event and r.position = 1
group by event_date;

[SQL Fiddle Demo]

【讨论】:

这个看起来可能有用。这个表达式中的“max”函数在做什么?此外,如果我想对所有结果应用查询中的另一个限制,我是否只需在“分组依据”语句之前添加它?如: 。其中提取(来自 e.event_date 的年份)='2016' maxcase 的组合可以解决问题,案例结果将具有一些 null 值,然后 max 将丢弃它们 - 您可以在 @ 之前添加任何 where 语句987654330@ - HTH ;). 希望是最后一个问题。 “名字”实际上是在一个单独的“参赛者”表上。因此,我在查询中使用了“entrant_id”而不是“name”。将 results.entrant_id 字段加入 entrants.id 字段的 JOIN 应该放在哪里? 只需在from events e之后添加到查询中;)。 我试过了,但它只从其中一列中获取名称。 SQL 小提琴:sqlfiddle.com/#!9/1135a/2【参考方案2】:

试试这个查询:

SELECT
  e.event_date,
  r1.name as class_40_winner,
  r2.name as class_30_winner
FROM
  events e,
  results r1,
  results r2
WHERE
  r1.class = 40 AND
  r2.class = 30 AND
  r1.position = 1 AND
  r2.position = 1 AND
  r1.result_event = e.id AND
  r2.result_event = e.id

【讨论】:

谢谢。这似乎接近我想要的。但是,如果某个事件的“40”类为空,则不会为该事件返回任何行。我尝试将 40 到 30 之间的“AND”更改为“OR”,但这会导致查询冻结。【参考方案3】:
SELECT e.event_data
     , r.class
     , r.name winner
  FROM events e
  JOIN results r
     ON r.result_event = e.id 
 WHERE  class IN (30,40) 
   AND position = 1

这个问题的其余部分是一个简单的显示问题,最好在应用程序代码中解决。

【讨论】:

以上是关于MySQL 查询耗时超过 6 秒的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb $near 查询 120 万份文档耗时 6 秒

Mysql 搜索 1.18 亿行耗时 86 秒

SQL 查询耗时过长

多表查询时,执行速度耗时太多

多表查询时,执行速度耗时太多

在 phpmyadmin SELECT WHERE 1 中显示第 0 - 0 行(共 1 行,查询耗时 0.0008 秒。)