我正在使用一些查找表以及主日誌表的事件跟蹤系統。在我撰寫的報告中,可以選擇一個對象來查看統計信息。界面按重要性遞減的順序顯示所有對象(即命中)。使用索引,使用臨時的,使用filesort - 如何解決這個問題?
兩個表(略下調,但你的GIST)的模式:
CREATE TABLE IF NOT EXISTS `event_log` (
`event_id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(5) DEFAULT NULL,
`object_id` int(5) DEFAULT NULL,
`event_date` datetime DEFAULT NULL,
PRIMARY KEY (`event_id`),
KEY `user_id` (`user_id`),
KEY `object_id` (`object_id`)
);
CREATE TABLE IF NOT EXISTS `lookup_event_objects` (
`object_id` int(11) NOT NULL AUTO_INCREMENT,
`object_desc` varchar(255) NOT NULL,
PRIMARY KEY (`object_id`)
);
我遇到的麻煩查詢如下。它適用於大約100個條目的表格,但EXPLAIN有點讓我擔心。
explain SELECT
el.object_id,
leo.object_desc,
COUNT(el.object_id) as count_rows
FROM
event_log el
LEFT JOIN lookup_event_objects leo ON leo.object_id = el.object_id
GROUP BY
el.object_id
ORDER BY
count_rows DESC,
leo.object_desc ASC
返回: Using index; Using temporary; Using filesort
那麼 - 有什麼錯我的架構和/或查詢爲MySQL依傍temporary
和filesort
?或者它是否可以使用ORDER BY進行優化?
我曾經從該查詢返回的最大對象數爲<300,雖然我將有可能擁有數百萬行的EVENT_LOG。我確認當我刪除ORDER BY時,使用臨時文件和使用filesort會消失。我會嘗試改變這一點,以便使用腳本語言(PHP)進行排序(在數組中)。感謝您的回覆和鏈接。 –
在MySQL中進行排序仍然可能更有效 - 它已經將數據加載到數據結構中,等等。 –
它肯定會更乾淨。感謝您的反饋。 –