MySQL 中的臨時和檔案排序問題:架構和查詢分析
在具有查找表和日誌記錄表的事件追蹤系統中,旨在按重要性降序顯示物件統計資訊的查詢出現了問題。雖然查詢在少量條目下正確運行,但其 EXPLAIN 結果表明了最佳化的潛力。
相關查詢利用 event_log 和 Lookup_event_objects 表之間的左連接,按 object_id 對結果分組,並按 count_rows 進行排序降序排列,然後按升序排列 object_desc。但是,此查詢會產生有關使用臨時表和檔案排序的警告。
當查詢包含與 GROUP BY 子句不同的 ORDER BY 子句時,或從除連接中的第一個。在這種情況下,排序是基於計算欄位的,因此無法使用索引,因此使用檔案排序。
要解決此問題,請刪除 leo.object_desc 的 ORDER BY 子句。這將消除對臨時表和文件排序的需要,從而提高查詢效能:
<code class="sql">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;</code>
以上是為什麼我的 MySQL 查詢會導致臨時表和檔案排序?的詳細內容。更多資訊請關注PHP中文網其他相關文章!