2016-09-16 7 views
1

私は大きなテーブル私は、検索に使用するクエリを最適化する必要があります(多言語テーブル)を持っているmysqlのクエリのチューニングは

テーブルの構造は次のとおりです。

table products 
    productID 
    code 
    price 

table products_lang 
    productID 
    lang 
    product_name 
    sub_title 
    status 

テーブルは、今、私はPRODUCT_NAMEを検索したい場合は、私は次のクエリ

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 
を使用240.000レコードの各

を持っています10

私は、クエリに一致するだけのIDを取得し、その後、私はこれらのIDは何か

を取得するためproducts_langが唯一のものは、上記のクエリがあまりにも多くの

で2-3秒を必要としていることであるクエリのクエリからは、

私は

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 

をproducts_langに直接検索を行う場合ははるかに高速ですが(私は、JOINを削除しているので)私はp.priceのDESC BY

をORDERを持っていない誰も私が何を助けることができますがクエリの高速化またはクエリの中断小さな2は、クエリ時間を最小限にするために、いくつかのフィルタ条件

INDEX your_name (status ,productName ,productID) 

の周り()

おかげで

+0

に参加するのEXISTSを使用しよう?...あなたのスキーマが表示されてください。 – scaisEdge

答えて

0

テーブルproducts_lang用フィルター行に適切なインデックスを追加し、(ちょうどマイナー)は役に立たないを削除します。

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

あなたはproduct_lang状況にインデックスを持っていますか代わりに二つのテーブル

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