簡體   English   中英

mysql以更快的方式?

[英]Mysql in a faster way?

我在MySQL數據庫中有一個表:

  CodeNo Block
   a1     a
   a2     a
   b1     b
   b2     b
   c1     c
   c2     c 

我可以使用以下兩種方法之一進行查詢:

select codeno from mytab where block='b' and codeno like 'b%'

或者

select codeno from mytab where codeno like 'b%'

當mytab中有數百萬條記錄時,在實際情況下哪一個更快? 還有誰能解釋它實際存儲在數據庫中的方式?

我認為兩者都需要相同的時間,因為兩者的執行計划是相同的

在此處輸入圖片說明

  1. 選擇數據

  2. 表掃描100%

並查看執行計划的詳細信息

在此處輸入圖片說明

在此處輸入圖片說明

如果沒有看到執行計划,我會猜測第一個過濾器會減少設置第二個過濾器的記錄數量,這會使第一個選項更快,特別是like運算符是一個字符串比較器,實際上並沒有那么有效作為數字或二進制比較。

要了解更多信息,您可以生成兩個語句的執行計划並比較運行時間,請查看文檔

第一個查詢應該更快,它通過使用塊過濾器來限制結果。

我會說:在block上應用索引以提高速度。

ALTER TABLE mytab添加索引blockindex(block);

請參閱sqlfiddle並比較執行計划: http ://sqlfiddle.com/#!9/317d6/1

請參閱@juergend有關注釋的評論。 問題是“取決於”。 如果在任何一個字段上都沒有索引,則數據庫將執行全表掃描,因此沒有真正的區別。 如果codeno具有index和block則沒有,那么這兩個語句仍然大致相等,因為在兩種情況下都將使用codeno上的索引。 如果在兩個字段上都具有索引,則如果DB認為使用塊索引進行首次訪問會更有利,那么具有兩個條件的字段可能會更快。 但是說明應該向您顯示數據庫決定用於訪問計划的內容。

如果表上沒有任何索引,則第一個查詢將花費更多時間,這是因為無法從內存中獲取任何內容,但是您必須檢查兩個字段而不是一個字段。

但是,當您可以添加自己的索引時,這種非規范化確實非常有用。 您可以僅添加(block)索引,以便在內存中進行相等性檢查,第二條件的數據將從磁盤中獲取,但僅針對與第一個條件匹配的那些行。 當匹配第一個條件的大多數行也匹配第二個條件時,這特別有用。

另一方面,您可以添加(codeno(1))索引,該索引將用於前綴檢查,如codeno like 'b%' (確保在索引中指定足夠長的前綴),這將幾乎需要相同的時間。 在這種情況下,甚至不需要條件block='b'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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