我有一个在特定查询上随机挂起(看似)的查询。我的大多数网站用户在运行此查询时都没有问题,但少数用户在网站上遇到超时问题,当我检查processlist
它时卡住了copying to tmp table
。
我相信硬盘驱动器跟不上,这导致复制到 tmp 表时挂起。
我不相信我可以更有效地优化查询。我想知道是否可以将服务器的第二个硬盘驱动器设置为临时表存储,这样我就可以分散服务器上的一些负载。
The query:
SELECT DISTINCT
activity_seismo_info.ID,
activity_seismo_info.CREATED_AT,
activity_seismo_info.UPDATED_AT,
....
activity_seismo_info.ASI_EXTRA_5,
seismo.ID,
....
seismo.SEISMO_NOTES
FROM `activity_seismo_info`
JOIN activity_info ON (activity_seismo_info.ASI_ACTIVITY_ID=activity_info.ID)
JOIN location ON (activity_info.ACTIVITY_LOCATION_ID=location.ID)
LEFT JOIN seismo ON (activity_seismo_info.ASI_SEISMO_ID=seismo.ID)
WHERE location.ID='193'
ORDER BY activity_info.ACTIVITY_EVENT_TIME DESC LIMIT 30
我在一个有 2GB RAM 和两个硬盘驱动器的 P4 上(第二个硬盘驱动器没有使用)
PHP5.2
MySQL 5.0.51a-3ubuntu5.4
带有 Propel 的 symfony 1.2 应用程序
更新
感谢@DTest 的建议,我发现我的查询在对结果进行限制之前返回了表中的所有行。但为了将来参考,有没有办法设置 MySQL 使用第二个硬盘驱动器作为临时表的“临时”驱动器?
在
my.cnf
使用这个选项tmpdir=/tmp
(无论如何这是默认设置,只需选择另一个文件夹)需要重启mysql
顺便说一句,因为这
location.ID
就是'193'
为什么甚至涉及位置表???尝试以下操作: