gpt4 book ai didi

使用文件排序和临时的 MySQL 查询

转载 作者:可可西里 更新时间:2023-11-01 07:06:31 25 4
gpt4 key购买 nike

我正在使用一个简单的 MySQL 查询,但由于使用了 ORDER BY,性能真的很差。我不明白为什么 MySQL 使用文件排序和临时排序。

我的查询是:

EXPLAIN 
SELECT * FROM Events
INNER JOIN EventLogFiles ON ServerID = 42
AND Events.LogFileID = EventLogFiles.LogFileID
ORDER BY ReportID DESC , TimeWritten DESC
LIMIT 100

这是 EXPLAIN 的输出:

Mysql EXPLAIN output

表事件结构

Table Events structure

表事件索引

Table Events indexes

表事件日志文件结构

Table EventLogFiles structure

表 EventLogFiles 索引

Table EventLogFiles indexes

更新:

我尝试创建两个新索引,但它们仍然强制 MySQL 使用文件排序和临时索引。

ALTER TABLE Events ADD INDEX  `ReportID_TimeWritten_ServerID_LogFileID` ( ReportID DESC,  TimeWritten DESC,  ServerID,  LogFileID)

ALTER TABLE Events ADD INDEX `ServerID_LogFileID_ReportID_TimeWritten` ( ServerID, LogFileID, ReportID DESC, TimeWritten DESC)

最佳答案

为了将索引用于选择和排序,您需要在事件的多列索引中包含以下所有列:(ServerID, LogFileID, ReportID, TimeWritten)

目前,MySQL 无法利用现有的多列索引,因为它不包含 LogFileID,它在您的 ON 子句中。

如果您遇到 MySQL 首先从 EventLogFiles 选择的问题,您可以将 INNER JOIN 更改为 STRAIGHT JOIN 以确保 MySQL 始终首先从 Events 选择,使用您的索引。

关于使用文件排序和临时的 MySQL 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9999679/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com