2010-09-15 167 views
2

我有以下表格:提高SQL查詢性能

  • 產品
  • 分類
  • 小類
  • 品牌

具有以下字段:

產品:

  • ID
  • 內容描述
  • 內容描述2
  • description3
  • id_category
  • id_subcategory
  • id_brand

分類:

  • ID

小類

  • ID

品牌

  • ID

我想是要進行查詢,用戶輸入1個或多個單詞,然後搜索我所有上述領域。

這是我的查詢現在:

SELECT DISTINCT p. * 
FROM products p, categories c, subcategories s, brands m 
WHERE p.name LIKE 'word%' 
OR p.description1 LIKE 'word%' 
OR p.description2 LIKE 'word%' 
OR p.description3 LIKE 'word%' 
OR (
c.name LIKE 'word%' 
AND c.id = p.id_category 
) 
OR (
s.name LIKE 'word%' 
AND s.id = p.id_subcategory 
) 
OR (
m.name LIKE 'word%' 
AND m.id = p.id_brand 
) 
LIMIT 10 ; 

有什麼辦法來調整這個查詢,使其更快?該數據庫已經有不少產品,所以我懷疑這個查詢顯示的時間可能是因爲這個。

任何消耗?

謝謝!

回答

1

像這樣的東西應該做的伎倆:

SELECT DISTINCT p. * 
FROM products p 
LEFT JOIN categories c ON c.id = p.id_category 
LEFT JOIN subcategories s ON s.id = p.id_subcategory 
LEFT JOIN brands m ON m.id = p.id_brand 
WHERE p.name LIKE 'word%' 
OR p.description1 LIKE 'word%' 
OR p.description2 LIKE 'word%' 
OR p.description3 LIKE 'word%' 
OR (IFNULL(c.name, '') LIKE 'word%') 
OR (IFNULL(s.name, '') LIKE 'word%') 
OR (IFNULL(m.name, '') LIKE 'word%') 
LIMIT 10; 
+0

或者使用INNER JOIN以防萬一您無法獲得NULL值產品表 – NoLifeKing 2010-09-15 11:31:45

+0

從30秒長到0.03秒用此解決方案:) – brunom 2010-09-15 11:41:56

+0

謝謝NoLifeKing – brunom 2010-09-15 11:42:15

1

如果全文搜索不是一種選擇,假設你已經正確索引你的表,你可以嘗試限制連接表的結果集。

SELECT DISTINCT p.* 
FROM products p 
     LEFT OUTER JOIN (
      SELECT DISTINCT id 
      FROM categories 
      WHERE name LIKE 'word%' 
      LIMIT 10 
     ) c ON c.id = p.id_category 
     LEFT OUTER JOIN (
      SELECT DISTINCT id 
      FROM subcategories 
      WHERE name LIKE 'word%' 
      LIMIT 10 
     ) s ON s.id = p.id_subcategory 
     LEFT OUTER JOIN (
      SELECT DISTINCT id 
      FROM brands 
      WHERE name LIKE 'word%' 
      LIMIT 10 
     ) m ON m.id = p.id_brand 
WHERE p.name LIKE 'word%' 
     OR p.description1 LIKE 'word%' 
     OR p.description2 LIKE 'word%' 
     OR p.description3 LIKE 'word%'   
LIMIT 10 
0

首先,我想代替條件在WHERE子句中加入與JOIN

FROM products p INNER JOIN categories c ON c.id = p.id_category INNER JOIN subcategories s ON s.id = p.id_subcategory INNER JOIN brands m ON m.id = p.id_brand 

(或使用LEFT JOIN,如果你有NULLABLE FK的)

然後,您需要在具有指標產品(名稱),產品(說明1),產品(說明2),(說明3),類別(名稱),子類別(名稱)和品牌(名稱)