簡體   English   中英

如何優化此查詢,需要花費至少一分鍾的時間來執行

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM