gpt4 book ai didi

mysql - 简单,索引良好,MySQL 查询大约需要一秒钟

转载 作者:行者123 更新时间:2023-11-29 01:42:37 25 4
gpt4 key购买 nike

我在我的网络应用程序中使用以下查询。它正在查询一个结果表,该表包含给定时间网上商店的价格。它有大约 100 万条记录。索引是一个 shopID、StartTime、pID 和 WebsiteID。

查询:

SELECT shopID, tresults.StartTime, tresults.Price
FROM tresults
WHERE tresults.pID = 7
AND WebsiteID = 1 AND StartTime BETWEEN "2013-4-10" AND "2013-4-11"
AND tresults.shopID IN (44, 68, 23, 16, 144, 8, 9, 5)
GROUP BY tresults.StartTime, tresults.Price
ORDER BY tresults.StartTime, tresults.Price

解释结果:

1, SIMPLE, tresults, index_merge, PRIMARY,idxPID,idxWebsite,idxStartTimeASC,idxStartTimeDESC,fk_shopID, idxPID,idxWebsite, 4,4, , 1062, Using intersect(idxPID,idxWebsite); Using where; Using temporary; Using filesort

对我来说看起来不错,但查询仍然需要大约一秒钟才能完成。这在快速网站中是 Not Acceptable 。

我怎样才能加快速度?

注意:速度看起来取决于 shopID 的数量

谢谢!

最佳答案

您的查询并没有您想象的那么好。它正在使用“使用临时”和“使用文件排序”。这意味着它已保存在您的文件系统中以供解析器操作并使查询速度变慢。

要尝试改进它,您可以尝试使 WHERE 子句中的字段与表中的索引相匹配。或者,如果您的查询将始终使用这些元素运行,甚至可以按以下顺序创建一个新索引:pID、websiteID、startTime。

我也不明白为什么您的查询中有两次字段 tresults.pID。

[编辑]

嘿伙计,你得到了临时表,因为你正在使用聚合函数来操作你的结果集,例如GROUP BY、ORDER BY、HAVING 等。只要临时表保存在内存中就可以了,这是访问数据的更快方法。问题是当这些表达到大到解析器必须将它们带到文件系统时。

您可以尝试找到最佳平衡更改 tmp_table_size 和 max_heap_table_size 的值。此外,一旦内存存储不支持它们,请尽量避免使用博客/文本列。

您可以在官方文档中找到更多信息。

关于mysql - 简单,索引良好,MySQL 查询大约需要一秒钟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15998835/

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