閱讀訂單的查詢非常緩慢。我嘗試了很多東西,但無法獲得更快的查詢。在查詢和數據庫表下面。當然,所有重要的領域都有一個索引。我注意到通過函數刪除組會加快速度,但對查詢進行分組非常重要。閱讀訂單的非常緩慢的mysql查詢(連接和分組)
有沒有更好的方式獲取訂單?提前致謝。
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`)
);
的解釋查詢
簡單的經驗法則:「where」,「join」,「group」或「order」子句中使用的任何字段都應該有一個索引。現在看起來你唯一的索引是'id'字段的主鍵。在整個查詢中做一個'explain ...'會告訴你在後臺發生了什麼。 –
簡單的經驗法則:沒有使用單詞EXPLAIN執行的相同查詢的結果,這樣的問題沒有任何意義。而只是盲目添加索引會使事情變得更糟 –
我在所有字段上都做了索引,但沒有在表格下面發表(我剛剛在問題中提到過)。 – Stefan