优化具有大量数据的MYSQL查询
Posted
技术标签:
【中文标题】优化具有大量数据的MYSQL查询【英文标题】:Optimize MYSQL query having lots of data 【发布时间】:2018-01-28 14:36:22 【问题描述】:有没有更好的方法来编写这个查询,因为它在大约 400k 行中搜索并需要 50 秒才能执行?
SELECT pfile_print_media_id
, market.market_name
, full_name
, image
, pfile_date
FROM pfile_print_media
LEFT
JOIN pfiles
ON pfiles.pfile_id = pfile_print_media.pfile_id
LEFT
JOIN publications
ON publications.publication_id = pfile_print_media.publication_id
LEFT
JOIN clients
ON pfiles.client_id = clients.client_id
LEFT
JOIN client_markets
ON client_markets.client_id = clients.client_id
LEFT
JOIN market
ON market.market_id = clients.market
WHERE pfiles.media_type = 'PRINT'
AND clients.market = 17
OR client_markets.market_id = 17
OR client_type = 'INTERNATIONAL'
GROUP
BY pfiles.pfile_id
ORDER
BY pfiles.pfile_date DESC
LIMIT 4
解释查询输出:
【问题讨论】:
表格和索引结构以及表格中的行数对于任何答案都是非常重要的。 @JamesZ 请看图片。我们可以进一步优化 您有一个 GROUP BY 子句,但没有聚合函数。这在当地被称为一个糟糕的开始。 @UdayB。您仍然需要提供表和索引结构供我们有效帮助。将SHOW CREATE TABLE pfile_print_media
的输出添加到您的问题中。对所有其他表也这样做。
将LEFT JOIN
更改为JOIN
,除非您有真正的理由使用LEFT
。限定每一列,以便我们知道每一列在哪个表中。GROUP BY
格式不正确,因为您有诸如日期之类的内容未包含在分组依据中。
【参考方案1】:
如果没有使用 Publications 表中的列 - 可能会用子查询替换联接以检查键是否存在将加快查询速度。
【讨论】:
如果您不在乎,也可以摆脱那张桌子。以上是关于优化具有大量数据的MYSQL查询的主要内容,如果未能解决你的问题,请参考以下文章