[英]How can I optimize this query, takes more than a min to execute
我有以下查詢需要花費超過一分鍾的時間來執行,我該如何優化它。 由於o.id desc的排序,它的速度很慢,如果我刪除它,查詢將執行幾毫秒。
select o.*, per.email, p.name
from order o
inner join product p
on o.product_id=p.id
inner join person per
on o.person_id=per.id
order by o.id desc
limit 100;
以下是解釋的結果
1 SIMPLE p index PRIMARY FK2EFC6C1E5DE2FC 8 NULL 6886 Using index; Using temporary; Using filesort
1 SIMPLE o ref FK67E9050121C383DB,FK67E90501FC44A17C FK67E90501FC44A17C 8 dev.p.id 58
1 SIMPLE per eq_ref PRIMARY PRIMARY 8 dev.o.person_id 1 Using index
所有表都是InnoDB,聯接位於主鍵和外鍵上。 除此之外,索引位於“ 人員”的“ 電子郵件”列和“ 訂單”的“ 狀態”列中
每個表中的記錄數
人:1,300,000產品:7,000訂單:70,000
計划者很可能沒有使用limit
提示在聯接之前從訂單表中消除行。 因此,服務器必須對所有行進行聯接,然后僅返回幾行。
嘗試這個:
select o.* from
(select * order order by id desc limit 100) o
inner join product p
on o.product_id=p.id
inner join person per
on o.person_id=per.id
order by o.id desc limit 100;
編輯:僅當有一個約束保證在Product和Person表中存在相應的行時,這才有效。
是的,我了解您的問題,在這種情況下,首先將查詢保存在.sql文件中。 您可以在Sql Server Management Studio的“工具”菜單中使用名為“數據庫引擎優化顧問”的sql服務器實用程序。
首先打開sql server並轉到工具,然后選擇選項“ Database Engine Tuning Advisor”。 然后選擇您之前存儲的文件。 現在在您正在使用的數據庫和用於查詢的表上打勾,然后在主菜單中單擊“開始分析”。 它顯示了您可能要立即創建的索引和狀態,以將該重新請求應用於您的查詢,轉到操作菜單,然后選擇“ Apply Recommandation”,它將在您的表上創建索引和狀態,並減少查詢的執行時間。
增加此變量的值,然后重新啟動MySQL服務器read_rnd_buffer_size,將變量設置為較大的值可以大大提高ORDER BY的性能。
您也可以參考http://www.mysqlperformanceblog.com/2007/07/24/what-exactly-is-read_rnd_buffer_size/
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.