我有张表
- t_order 订单表 -- 每卖出一件商品就会在订单表有一条记录
- t_product 商品表
需求 查询销售排行前10的商品
SELECT o.product_id,COUNT(*) AS num
FROM t_order o
GROUP BY o.product_id
ORDER BY COUNT(*) DESC
问题 通过explain 发现 有一个致命的问题 mysql 使用了临时表和 filesort 这种情况表数据一旦上了百万,效率会断崖式下降
请问如何解决这个order by 问题
最后附上建表sql
CREATE TABLE t_order
(
order_id
int(11) NOT NULL AUTO_INCREMENT,
product_id
int(11) DEFAULT NULL,
deal_price
int(11) DEFAULT NULL,
PRIMARY KEY (order_id
),
KEY idx_product_id
(product_id
)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4;
insert into t_order
(order_id
,product_id
,deal_price
) values (1,2,18);
insert into t_order
(order_id
,product_id
,deal_price
) values (2,3,30);
insert into t_order
(order_id
,product_id
,deal_price
) values (3,2,9);
CREATE TABLE t_product
(
product_id
int(11) NOT NULL AUTO_INCREMENT,
product_name
varchar(32) DEFAULT NULL,
PRIMARY KEY (product_id
),
KEY idx_product_id
(product_id
)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8mb4;
insert into t_product
(product_id
,product_name
) values (2,'葡萄');
insert into t_product
(product_id
,product_name
) values (3,'苹果');
insert into t_product
(product_id
,product_name
) values (4,'香蕉');