0

我使用 PDO Mysql,并请求为我的数据库中的产品选择最便宜的报价。它工作正常,唯一的问题是它很慢(对于 200 个报价(并且仍然只有 25 个返回))它需要将近一秒钟,这比我的目标要高得多。

我不是 SQL 专家,所以我在这件事上寻求您的帮助。这是请求,如果需要,我很乐意提供更多信息:

SELECT
            mo.id AS id, 
            mo.stock AS stock, 
            mo.price AS price,
            mo.promotional_price AS promotional_price, 
            mo.picture_1 AS picture_1, 
            mo.picture_2 AS picture_2, 
            mo.picture_3 AS picture_3, 
            mo.picture_4 AS picture_4, 
            mo.picture_5 AS picture_5, 
            mo.title AS title, 
            mo.description AS description, 
            mo.state AS state, 
            mo.is_new AS is_new, 
            mo.is_original AS is_original, 
            c.name AS name, 
            u.id AS user_id, 
            u.username AS username, 
            u.postal_code AS postal_code,
            p.name AS country_name, 
            ra.cache_rating_avg AS cache_rating_avg, 
            ra.cache_rating_nb AS cache_rating_nb, 
            GROUP_CONCAT(md.delivery_mode_id SEPARATOR ', ') AS delivery_mode_ids, 
            GROUP_CONCAT(ri.title SEPARATOR ', ') AS delivery_mode_titles

        FROM 
            mp_offer mo, catalog_product_i18n c,
            ref_country_i18n p, mp_offer_delivery_mode md,
            ref_delivery_mode r, 
            ref_delivery_mode_i18n ri, user u 

        LEFT JOIN mp_user_review_rating_i18n ra 
            ON u.id = ra.user_id 

        WHERE (mo.product_id = c.id 
                AND mo.culture = c.culture 
                AND mo.user_id = u.id 
                AND u.country_id = p.id 
                AND mo.id = md.offer_id
                AND md.delivery_mode_id = ri.id 
                AND mo.culture = ri.culture) 
            AND (mo.culture = 1
                AND p.culture = 1) 
            AND mo.is_deleted = 0
            AND mo.product_id = 60 
            AND ((u.holiday_start IS NULL)
                OR (u.holiday_start = '0000-00-00') 
                OR (u.holiday_end IS NULL)
                OR (u.holiday_end = '0000-00-00') 
                OR (u.holiday_start > '2012-05-03')
                OR (u.holiday_end < '2012-05-03')) 
            AND mo.stock > 0
        GROUP BY mo.id 
        ORDER BY IF (mo.promotional_price IS NULL,
                    mo.price,
                    LEAST(mo.price, mo.promotional_price)) ASC 

        LIMIT 25 OFFSET 0;

我接受将“文化”设置为 1、未删除、有一些库存且卖家不在假期的特定产品的报价。我按价格订购(promotional_price 有一个)。

LEAST 是一个缓慢的函数吗?

这是 EXPLAIN 的输出:

id  select_type table   type    possible_keys                                                                       key     key_len ref                                 rows    Extra
1   SIMPLE      c       const   PRIMARY,catalog_product_i18n_product,catalog_product_i18n_culture                   PRIMARY 8       const,const                         1       "Using temporary; Using filesort"
1   SIMPLE      mo      ref     PRIMARY,culture,is_deleted,product_id,user_id                                       culture 4       const                               3       "Using where with pushed condition"
1   SIMPLE      u       eq_ref  PRIMARY,user_country                                                                PRIMARY 4       database.mo.user_id                 1       "Using where with pushed condition"
1   SIMPLE      p       eq_ref  PRIMARY,ref_country_i18n_culture                                                    PRIMARY 8       database.u.country_id,const         1   
1   SIMPLE      r       ALL     NULL                                                                                NULL    NULL    NULL                                3       "Using join buffer"
1   SIMPLE      ra      ALL     NULL                                                                                NULL    NULL    NULL                                4   
1   SIMPLE      md      ref     PRIMARY,fk_offer_has_delivery_mode_delivery_mode1,fk_offer_has_delivery_mode_offer1 PRIMARY 4       database.mo.id                      2   
1   SIMPLE      ri      eq_ref  PRIMARY                                                                             PRIMARY 2       database.md.delivery_mode_id,const  1

提前感谢您在优化此请求方面的帮助。

Ĵ

4

1 回答 1

0

您没有使用包含在 from 子句中的 ref_delivery_mode 表。它得到了表格结果的笛卡尔积的原因。

于 2012-05-03T09:44:15.510 回答