gpt4 book ai didi

mysql - 读取订单的 mysql 查询非常慢(连接和分组依据)

转载 作者:行者123 更新时间:2023-11-29 00:14:31 25 4
gpt4 key购买 nike

读取订单的查询非常慢。我已经尝试了很多东西,但无法获得更快的查询。在查询和数据库表下方。当然,所有重要的字段都有一个索引。我注意到按函数删除分组会加快速度,但对查询进行分组很重要。

是否有更好的获取订单的方式?提前致谢。

SELECT
orders.id AS orderId, orders.delivery_from, orders.delivery_to,
orders_products.product_id, orders_products.color_id, ,orders_products.size_id,
sum(orders_products.quantity) as quantity,
customers.id AS customerId, customers.name AS customerName,
products.name
FROM orders
INNER JOIN orders_products ON orders_products.order_id=orders.id
INNER JOIN customers ON customers.id=orders.customer_id
INNER JOIN products ON orders_products.product_id=products.id
LEFT JOIN orders_product_data ON orders_product_data.order_id=orders.id AND orders_product_data.product_id=orders_product.product_id AND orders_product_data.color_id=orders_product.color_id
WHERE orders.status='0' AND
(orders.delivery_from<='2014-05-05' AND orders.delivery_to>='2014-05-05') AND
((orders_products_data.delivery_from<='2014-05-05' || orders_products_data.delivery_to=0) AND (orders_products_data.delivery_from>='2014-05-05' || orders_products_data.delivery_to=0))
GROUP BY customer_id, product_id, color_id, size_id

客户

CREATE TABLE IF NOT EXISTS `customers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(90) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
);

产品

CREATE TABLE IF NOT EXISTS `products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`name` varchar(20) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
);

订单

CREATE TABLE IF NOT EXISTS `orders` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`customer_id` int(11) NOT NULL,
`delivery_from` date NOT NULL,
`delivery_to` date NOT NULL,
`status` int(1) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);

订单产品

CREATE TABLE IF NOT EXISTS `orders_products` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL DEFAULT '0',
`product_id` int(11) NOT NULL DEFAULT '0',
`color_id` int(11) NOT NULL DEFAULT '0',
`size_id` int(11) NOT NULL DEFAULT '0',
`quantity` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
);

颜色数据。下表存储了组合 order_id、product_id 和 color_id 的交货信息,因为不同颜色的产品的交货可能会发生变化。

CREATE TABLE IF NOT EXISTS `orders_products_data` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`order_id` int(11) NOT NULL DEFAULT '0',
`product_id` int(11) NOT NULL DEFAULT '0',
`color_id` int(11) NOT NULL DEFAULT '0',
`delivery_from` date NOT NULL,
`delivery_to` date NOT NULL,
PRIMARY KEY (`id`)
);

解释查询 enter image description here

最佳答案

您提到您有所有重要字段的索引。

Just for your Info - Index 应该根据访问路径而不是针对重要字段准备。

在为订单、orders_product_data 替换“...”和“...”之间的 delivery_from 并添加以下索引后进行检查:在订单上创建索引 idx_orders_status_delivery_from_to(status,delivery_from,delivery_to);

关于mysql - 读取订单的 mysql 查询非常慢(连接和分组依据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23475831/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com