簡體   English   中英

在MySql上使用FIND_IN_SET查詢的速度

[英]Speed of query using FIND_IN_SET on MySql

我從產品目錄中查詢了幾個問題。 查詢如下:

SELECT DISTINCT (cc_id) FROM cms_catalogo 
JOIN cms_catalogo_lingua ON ccl_id_prod=cc_id 
JOIN cms_catalogo_famiglia ON (FIND_IN_SET(ccf_id, cc_famiglia) != 0) 
JOIN cms_catalogo_categoria ON (FIND_IN_SET(ccc_id, cc_categoria) != 0) 
JOIN cms_catalogo_sottocat ON (FIND_IN_SET(ccs_id, cc_sottocat) != 0) 
LEFT JOIN cms_catalogo_order ON cco_id_prod=cc_id AND cco_id_lingua=1 AND cco_id_sottocat=ccs_id 
WHERE ccc_nome='Alpine Skiing' AND ccf_nome='Ski'

我注意到第一次查詢平均需要4.5秒,然后變得很快。 我使用FIND_IN_SET因為在我的數據庫表“cms_catalogo”中我有“cc_famiglia”,“cc_categoria”和“cc_sottocat”列,內部ID用逗號分隔(我知道它很愚蠢)。

例:

cms_catalogo

專欄 cc_famiglia :1,2,3,4,5

cms_catalogo_famiglia

ccf_id :3

查詢的減速可能源於使用FIND_IN_SET那種方式?

如果沒有用逗號分隔的ID而不是具有ID作為索引的表會更快嗎?

但是,我無法解釋為什么第一次執行查詢的速度非常慢,然后加速

最好在表之間使用約束連接。 所以你最好通過主鍵連接它們。

如果您只想快速優化此查詢:

  • 檢查mysql中的explain select ...以查看查詢的性能;
  • 為列ccc_id, ccf_id, ccs_id添加索引;
  • 檢查explain select ...添加索引后。

第一個MySQL查詢需要花費更多時間,因為它是原始查詢,下一個是高速緩存。 所以你應該依賴第一個查詢時間。 如果報告不復雜,則執行時間應小於50-100ms,否則可能會導致性能問題。 因為我非常確定它不是您應用程序的唯一查詢。

暫無
暫無

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

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