0

我的数据库中有以下表格:

产品收藏:

CREATE TABLE `product_fav` (   
`user_id` int(9) unsigned NOT NULL,
`asin` varchar(10) NOT NULL DEFAULT '',  
`date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,   
`price` decimal(7,2) NOT NULL,   
PRIMARY KEY  (`user_id`,`asin`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8

产品信息:

CREATE TABLE `product_info` (
`asin` varchar(10) NOT NULL,
`name` varchar(200) DEFAULT NULL,
`brand` varchar(50) DEFAULT NULL,
`part_number` varchar(50) DEFAULT NULL,
`url` text,
`image` text,
`availabillity` tinyint(1) NOT NULL DEFAULT '1',
PRIMARY KEY (`asin`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

产品价格:

CREATE TABLE `product_price` (
`asin` varchar(10) NOT NULL,
`date` date NOT NULL,
`timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`price` decimal(7,2) NOT NULL DEFAULT '0.00',
PRIMARY KEY (`asin`,`date`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8

我有以下查询:

SELECT   pi.*, 
         pp.price, 
         pf.date, 
         pf.price                                          AS price_added, 
         round((100.0 (pp.price - pf.price) / pf.price),0) AS percentdiff 
FROM     product_info pi 
JOIN 
         ( 
                  SELECT   * 
                  FROM     product_price 
                  ORDER BY date DESC) pp 
ON       pp.asin = pi.asin 
JOIN     product_fav pf 
ON       pp.asin = pf.asin 
WHERE    pf.user_id=". $user['user_id'] ." 
GROUP BY asin 

产品价格记录多,查询需要3秒左右。有没有可能让它更快?

我对搜索查询也有同样的问题:

SELECT pi.*, 
       price, 
       date 
FROM   product_info pi 
       JOIN (SELECT * 
             FROM   product_price 
             ORDER  BY date DESC) pp 
         ON pi.asin = pp.asin 
WHERE  ( ` NAME ` LIKE '%".$search."%' ) 
GROUP  BY pi.asin 
ORDER  BY price 

解释返回这个:

+----+-------------+---------------+--------+---------------+---------+---------+---------------+--------+---------------------------------+
| id | select_type | table         | type   | possible_keys | key     | key_len | ref           | rows   | Extra                           |
+----+-------------+---------------+--------+---------------+---------+---------+---------------+--------+---------------------------------+
|  1 | PRIMARY     | <derived2>    | ALL    | NULL          | NULL    | NULL    | NULL          | 106709 | Using temporary; Using filesort |
|  1 | PRIMARY     | pi            | eq_ref | PRIMARY       | PRIMARY | 32      | pp.asin       |      1 |                                 |
|  1 | PRIMARY     | pf            | eq_ref | PRIMARY       | PRIMARY | 36      | const,pp.asin |      1 |                                 |
|  2 | DERIVED     | product_price | ALL    | NULL          | NULL    | NULL    | NULL          | 112041 | Using filesort                  |
+----+-------------+---------------+--------+---------------+---------+---------+---------------+--------+---------------------------------+
4

2 回答 2

1

尝试在您的查询上运行 EXPLAIN 以确定瓶颈在哪里。内部查询中的 ORDER BY 日期是什么?尝试摆脱它。还可以尝试用 JOIN 替换内部查询,它们往往更快。另外,您在日期字段上有索引吗?尝试在查询末尾为 ORDER BY 添加一个。

于 2018-08-23T15:23:45.533 回答
1

ORDER之前JOIN不需要,如果您需要在之后进行排序WHEREGROUP BY那么要排序的数据就更少了。

JOIN 
         ( 
                  SELECT   * 
                  FROM     product_price 
                  ORDER BY date DESC) pp 

为 asin 创建索引,这样 JOINforON pp.asin = pi.asin会更高效

创建索引,user_id这样WHERE pf.user_id=". $user['user_id'] ."会更有效率

于 2018-08-23T15:25:42.847 回答