我有一个很大的查询需要优化,它由1个表请求和5个表左连接组成。
此查询需要0.3428秒才能完成(结果:总共4340个,查询需要0.3428秒)
我正在处理大约10000个条目,这些条目肯定会增长。
现在它自己的查询不是问题,而是最大的问题是IN语句。
我有两份陈述
都在WHERE语句中
对于这个特定的页面,两者都有大量的ID,3344个ID条目示例:(99,1,5,8458,…)
这两个IN语句都有一组相同的3344 ID示例:((cf.catid IN(99,1,5,8458,…)和cf.c id=c.id)或p.category IN(99,1,5,8458,…)
查询如下所示:

SELECT
    p.id, c.id AS pCid, c.name AS cName, p.name, p.seo,
    p.description AS pDescription, cd.description,
    p.category, p.archive, cf.catid, cf.pid, p.order_nr,
    c.order_nr AS cOrder, c.seo AS cSeo, cat.name AS catName,
    cat.order_id, pr.price, pr.sale_price, pr.sale_expiry,
    IF( pr.sale_price > 0, pr.sale_price, pr.price ) AS `oPrices`,
    pr.member_price, p.`set`, p.get_the_look,
    c.from_text_price, c.thumb, c.code AS colour_code,
    p.code AS product_code, p.supplier_part_number,
    p.oem_part_number, p.make, p.model, p.year, p.sub_model
FROM
    products p
    LEFT JOIN category_featured cf ON p.id=cf.pid
    LEFT JOIN colours c ON c.pid=p.id
    LEFT JOIN colour_descriptions cd ON c.id=cd.colour_id
    LEFT JOIN category cat ON cat.id=p.category
    LEFT JOIN pricing pr ON pr.cid=c.id
WHERE
    (
        (cf.catid IN ( .. 3344 ID entries .. ) AND cf.cid=c.id) OR p.category IN ( .. 3344 ID entries .. )
    )
    AND p.archive='0'

    AND p.status='1' AND c.status='1'
    AND c.archive='0'
    AND cat.status IN (1,2)

GROUP BY `c`.`id`
ORDER BY `oPrices` DESC

有没有更好的方法来使用in语句检查表中的特定ID,或者一起使用其他检查?
速度是这里的主要问题,我想达到最好的性能可能。
到目前为止,我所做的以及一些设置是如何设置的:
我为那些表创建了索引(只有在这个查询中使用的INT(整数)列才有索引)
有些表是MyISAM,有些是InnoDB(查询中未使用的其他表与查询中的一些表有关系,因此它们必须是InnoDB)
查询中表之间没有关系
要运行查询,我使用PHP和MySQLI
谢谢
更新!!!!
我注意到为什么查询速度太慢了我创建的新列,使用IF语句oPrices然后使用“ORDER BYoPricesDESC”会使查询速度变慢,一旦删除它,查询只需要0.00009秒,这真是太神奇了!!! 但现在我无法得到正确排序的数据,如果我使用PHP进行排序,我将不得不创建一个新的分页函数,这是不理想的。

最佳答案

IN会使查询很难优化,因为索引可能不被使用(您可以使用EXPLAIN来验证这一点)。另一种方法是将这些id加载到临时表中,然后执行JOIN
从这个链接:
http://explainextended.com/2009/08/18/passing-parameters-in-mysql-in-list-vs-temporary-table/
我们可以看到一个大的参数列表,将它们传入
临时表作为常量列表要快得多,而对于
小列表的性能几乎相同。
使用临时表是传递
MySQL中的参数。

关于mysql - 使用IN条目的负载优化查询,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12498447/

10-12 07:38
查看更多