2016-09-16 50 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