簡體   English   中英

我不確定我是否有正確的索引,或者我是否可以提高MySQL中查詢的速度?

[英]I'm not sure if I have the correct indexes or if I can improve the speed of my query in MySQL?

我的查詢有一個連接,看起來它使用兩個索引,這使它更復雜。 我不確定我是否能改進這一點,但我想我會問。

該查詢生成一個記錄列表,其中包含與要查詢的記錄類似的關鍵字。

這是我的查詢。

SELECT match_keywords.padid,
       COUNT(match_keywords.word) AS matching_words
FROM   keywords current_program_keywords
       INNER JOIN keywords match_keywords
         ON match_keywords.word = current_program_keywords.word
WHERE  match_keywords.word IS NOT NULL
       AND current_program_keywords.padid = 25695
GROUP  BY match_keywords.padid
ORDER  BY matching_words DESC
LIMIT  0, 11  

解釋 替代文字

Word是varchar(40)。

您可以從嘗試刪除IS NOT NULL測試開始,該測試由字段上的COUNT隱式刪除。 看起來你也想從match_keywords省略25695,否則25695(或其他)肯定會在你的11行限制中顯示為“最佳”匹配?

SELECT     match_keywords.padid,
           COUNT(match_keywords.word) AS matching_words
FROM       keywords current_program_keywords
INNER JOIN keywords match_keywords
        ON match_keywords.word = current_program_keywords.word
WHERE      current_program_keywords.padid = 25695
GROUP BY   match_keywords.padid
ORDER BY   matching_words DESC
LIMIT      0, 11

接下來,考慮一下如何做一個人。

  • 您將以padid(25695)開頭並檢索該padid的所有單詞
  • 從這些單詞列表中,再次返回表格,對於每個匹配的單詞,獲取他們的padid(假設padid + word沒有重復)
  • 將padid組合在一起並計算它們
  • 命令計數並返回最高11

使用3個單獨的單列索引列表,前兩個步驟(都只涉及2列)將始終必須從索引跳回到數據以獲取另一列。 覆蓋索引可能會有所幫助 - 創建兩個要測試的復合索引

create index ix_keyword_pw on keyword(padid, word);
create index ix_keyword_wp on keyword(word, padid);

使用這些復合索引,您可以刪除padidword上的padid索引,因為它們被這兩個索引覆蓋。

注意:您始終必須調整SELECT性能

  • 索引的大小(您創建的存儲越多)
  • 插入/更新性能(索引越多,提交所需的時間越長,因為它必須更新數據,然后更新所有索引)

請嘗試以下操作...確保PadID上的索引和WORD上的索引。 然后,通過更改SELECT WHERE限定符的順序,首先應對CURRENT關鍵字的PADID進行優化,然后加入其他...將連接排除到自身。 此外,由於您正在檢查內部聯接與匹配關鍵字的相等性...如果檢查當前關鍵字為null,則它應該永遠不會加入空值,從而消除了對MATCH關鍵字別名的比較,因為查看了每個比較尋找NULL ...

SELECT STRAIGHT_JOIN
      match_keywords.padid,
      COUNT(*) AS matching_words 
   FROM
      keywords current_program_keywords
         INNER JOIN keywords match_keywords          
            ON match_keywords.word = current_program_keywords.word 
            and match_keywords.padid <> 25695
   WHERE  
          current_program_keywords.padid = 25695
      AND current_program_keywords.word IS NOT NULL
   GROUP BY 
      match_keywords.padid 
   ORDER BY 
      matching_words DESC 
   LIMIT
      0, 11 

您應該索引以下字段(檢查對應的表)

match_keyword.padid

current_program_keywords.padid

match_keyword.words

current_program_keywords.words

希望它有助於加速

暫無
暫無

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

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