2016-09-16 48 views
1

我有一個大表(多語言表),我需要優化我搜索使用的查詢的MySQL查詢優化

表的結構是:

table products 
    productID 
    code 
    price 

table products_lang 
    productID 
    lang 
    product_name 
    sub_title 
    status 

的表,現在有240.000記錄每個

當我想尋找這裏給我用下面的查詢

SELECT DISTINCT(p.productID) 

FROM products as p 

INNER JOIN products_lang as l ON 
l.productID=p.productID 
AND lang='en'     

WHERE  
(l.productName LIKE '%keyword%') 

AND l.status = '1' 

ORDER BY p.price desc 
LIMIT 0,10 

從查詢我只得到匹配查詢,然後我只查詢這些ID來獲得其它任何事情products_lang的IDS

的事情是,上面的查詢需要2-3秒是太多

如果我做搜索直接products_lang

SELECT DISTINCT(l.productID) 

FROM products_lang as l 

WHERE 

l.lang='en'     

AND (l.productName LIKE '%keyword%') 
AND l.status = '1' 

LIMIT 0,10 

的速度要快得多,但我沒有ORDER BY p.price遞減(因爲我已經刪除JOIN)

誰能幫我做的查詢速度更快或中斷查詢在2個較小的,以儘量減少查詢時間

感謝

+0

你對product_lang狀態指數?..顯示您的模式請 – scaisEdge

回答

0

在過濾器行添加適當的索引表products_lang和(只是次要的)去除無用的()周圍的一些過濾條件

INDEX your_name (status ,productName ,productID) 

SELECT DISTINCT(p.productID) 

FROM products as p 

INNER JOIN products_lang as l ON l.productID=p.productID AND l.lang='en'     

WHERE l.productName LIKE '%keyword%' 
AND l.status = '1' 

ORDER BY p.price desc 
LIMIT 0,10 
0

嘗試使用EXISTS,而不是將兩個表

SELECT p.productID 
FROM products as p 
WHERE EXISTS (SELECT 1 FROM products_lang as l WHERE l.productID=p.productID AND 
               lang='en' AND 
               l.status = '1' AND 
               l.productName LIKE '%keyword%') 
ORDER BY p.price desc 
LIMIT 0,10