[英]MySQL preprocessor optimization
在啟動查詢之前,有沒有人知道MySQL是否涉及任何預處理器優化?
考慮以下查詢:
string query = "SELECT giveaway_id FROM giveaways WHERE status >= @minStatus AND status <= @maxStatus AND type >= @minType AND type <= @maxType";
如果@minStatus
和@maxStatus
相等,以及@minType
和@maxType
,我們可以用更優化的形式寫上面的查詢:
string query = "SELECT giveaway_id FROM giveaways WHERE status = @minStatus AND type = @minType";
我想知道MySQL是否足夠智能,或者在我的C#應用程序中啟動它之前我應該幫助它編寫適當的優化語句。
謝謝。
這取決於你擁有的索引。 INDEX(status), INDEX(type)
很沒用。 INDEX(status, type)
(或相反的順序) 可能效果很好。
這取決於您使用的是什么版本。 較新版本使用“索引條件下推”,在這種情況下可能更智能。
舊版本可能會看到不平等並決定它是一個“范圍”。 然后它會說“2個范圍,所以我不能使用INDEX(status, type)
的兩個部分INDEX(status, type)
”。
EXPLAIN FORMAT=JSON SELECT ...
(5.6或更新版本)將為您提供一些線索。
FLUSH STATUS;
SELECT ...;
SHOW SESSION STATUS LIKE 'Handler%';
(在任何版本中)將為您提供更強的線索。 如果Handler_read_next
的值大約等於返回的行數,則它盡可能高效地運行。
另一種可能的皺紋......變量並不總是像文字一樣工作,所以也要用文字值進行測試。
這個評論太長了。
您所指的步驟不是“預處理”,而是“編譯和優化”。 而且,是的,MySQL的做各種優化,描述在這里 。
然而,你的問題的含義是,單個相等比較=
將比兩個不等式快得多。 通常情況並非如此。 更大的問題是索引是否可用於status
和type
。 索引的使用將是性能的主要因素 - 多個不等式可能會阻止MySQL找到最佳索引。
我的建議是為您的查詢創建正確的索引。 然后編寫查詢以確保它們利用索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.