2010-05-19 264 views
1

我在尝试优化下面列出的SQL查询。
它基本上是一个基于产品名称检索产品的搜索引擎代码。它还检查产品型号以及是否启用。
这执行约1.6秒的时候我直接通过phpMyAdmin的工具运行它,但需要大约3秒,总在与它被放置在PHP文件一起加载。SQL查询花费的时间太长

我需要添加一个类别搜索功能和现在,这是崩溃的MySQL服务器,帮助!

贾斯汀

SELECT DISTINCT 
    p.products_id, 
    p.products_image, 
    p.products_price, 
    s.specials_new_products_price, 
    p.products_weight, 
    p.products_unit_quantity, 
    pd.products_name, 
    pd.products_img_alt, 
    pd.products_affiliate_url 
FROM 
    products AS p 
    LEFT JOIN 
     vendors v 
    ON 
     v.vendors_id = p.vendors_id 
    LEFT JOIN 
     specials AS s 
    ON 
     s.products_id = p.products_id 
     AND 
     s.status = 1, 
    categories AS c, 
    products_description AS pd, 
    products_to_categories AS p2c 
WHERE 
    (
     (
      pd.products_name LIKE '%cleaning%' 
      AND 
      pd.products_name LIKE '%supplies%' 
     ) 
     OR 
     (
      p.products_model LIKE '%cleaning%' 
      AND 
      p.products_model LIKE '%supplies%' 
     ) 
     OR 
     p.products_id = 'cleaning supplies' 
     OR 
     v.vendors_prefix = 'cleaning supplies' 
     OR 
      CONCAT (CAST (v.vendors_prefix AS CHAR), '-', CAST (p.products_id AS CHAR)) = 'cleaning supplies' 
    ) 
    AND 
    p.products_status = '1' 
    AND 
    c.categories_status = '1' 
    AND 
    p.products_id = pd.products_id 
    AND 
    p2c.products_id = pd.products_id 
    AND 
    p2c.categories_id = c.categories_id 
ORDER BY 
    pd.products_name 
+4

你能后的输出'EXPLAIN your_query'? – richsage 2010-05-19 19:41:29

+0

查询没有搜索部分需要多长时间;是搜索还是加入正在放慢速度? – jeroen 2010-05-19 19:59:48

+0

如果你有很多行,那么你应该使用Mysql索引。谷歌关于他们,它可以使查询更快。 – 2010-05-19 19:49:32

回答

3
left join specials as s on s.products_id = p.products_id and s.status = 1, 

有你已经全表扫描。这种数据(tinyint,true/false)并不能很好地被InnoDB处理。在Oracle中,你有类似于位图索引的东西,这对低选择性索引很有用。你可以使用子查询,在那里,这样的事情:

... 
where 
    p.product_id IN (SELECT S.status FROM specials s WHERE s.status = 1) 
AND 
    (
      (pd.products_name like '%cleaning%' and pd.products_name like '%supplies%') or 
... 

然后,您的查询缓存祈祷缓存从子查询的结果。

发布您的解释!

0
select p.products_id, p.products_image, p.products_price, 
    p.products_weight, p.products_unit_quantity, 
    s.specials_new_products_price, 
    pd.products_name, pd.products_img_alt, pd.products_affiliate_url 
from products as p 
    left join vendors v ON v.vendors_id = p.vendors_id 
    left join specials as s on s.products_id = p.products_id, 
    left join products_description as pd on pd.products_id = p.products_id 
    left join products_to_categories as p2c on p2c.products_id = p.products_id 
    left join categories as c on c.categories_id = p2c.categories_id 
where 
     (
      (pd.products_name like '%cleaning%' and pd.products_name like '%supplies%') or 
      (p.products_model like '%cleaning%' and p.products_model like '%supplies%') or 
      p.products_id = 'cleaning supplies' or 
      v.vendors_prefix = 'cleaning supplies' or 
      CONCAT(CAST(v.vendors_prefix as char), '-', CAST(p.products_id as char)) = 'cleaning supplies' 
     ) 
    and p.products_status = '1' 
    and s.status = 1 
    and c.categories_status = '1' 
group by p.products_id 
order by pd.products_name 

确保您有以下指标设置:

create index prod_prodid_status on products(products_id, products_status); 
create index vendors_vendorid on vendors(vendors_id); 
create index specials_prodid_status on vendors(products_id, `status`); 
create index prod_desc_prodid_prodname on products_description(products_id, products_name); 
create index prod_cat_prodid_catid on products_to_categories(products_id, categories_id); 
create index categories_catid_status on categories(categories_id, categories_status); 

,我希望所有与“ID”字段在他们的名字是整数