2014-05-05 46 views
1

閱讀訂單的查詢非常緩慢。我嘗試了很多東西,但無法獲得更快的查詢。在查詢和數據庫表下面。當然,所有重要的領域都有一個索引。我注意到通過函數刪除組會加快速度,但對查詢進行分組非常重要。閱讀訂單的非常緩慢的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`) 
); 

的解釋查詢 enter image description here

+2

簡單的經驗法則:「where」,「join」,「group」或「order」子句中使用的任何字段都應該有一個索引。現在看起來你唯一的索引是'id'字段的主鍵。在整個查詢中做一個'explain ...'會告訴你在後臺發生了什麼。 –

+1

簡單的經驗法則:沒有使用單詞EXPLAIN執行的相同查詢的結果,這樣的問題沒有任何意義。而只是盲目添加索引會使事情變得更糟 –

+0

我在所有字段上都做了索引,但沒有在表格下面發表(我剛剛在問題中提到過)。 – Stefan

回答

1

你剛纔提到,你有所有重要領域的指標。

只爲您的信息 - 索引應根據訪問路徑而不是重要字段準備。

檢查更換delivery_from之間 '......' 和 '...' 的訂單,orders_product_data並添加以下指標後: 創建訂單指數idx_orders_status_delivery_from_to(status,delivery_from,delivery_to);

+0

thnx您的答案serush。我爲此做了一個額外的索引,現在速度更快。你有更多的索引技巧嗎?正如之前所評論的,我已經爲時序order_id,product_id和color_id字段爲orders_products_data製作了一個索引。 – Stefan

+0

如果不使用幾乎與內部連接相同的查詢,是否可以計算每個客戶的產品數量? – Stefan

+0

@Stefan - 感謝您接受答案。 以下鏈接將清除有關索引和它如何工作: http://stackoverflow.com/questions/1108/how-does-database-indexing-work http://www.programmerinterview.com/index.php/數據庫的SQL /什麼是一個索引/ 我相信你將能夠找出所需的索引,如果瞭解如何索引工作和我們得到的數據庫在表中添加索引後的開銷。 –