2015-09-05 79 views
1

我有兩個正在比較的表格(NewProducts和OldProducts)。 NewProducts約有68,000條記錄,OldProducts約51,000條。我在每個表上使用覆蓋索引,但是查詢需要20分鐘才能執行,所以我沒有正確使用它。覆蓋指數是否真的適用於多個表格?我究竟做錯了什麼?謝謝。覆蓋索引和mysql中的兩個表格

這裏是我的查詢碼和指標:

$querystring = "SELECT newProducts.Id, newProducts.SKU, 
    newProducts.Title, oldProducts.Title, oldProducts.product_Id 
     FROM 
    newProducts, oldProducts 
     WHERE 
    trim(newProducts.SKU)=trim(oldProducts.SKU) and 
    trim(newProducts.Title)=trim(oldProducts.Title) and 
    oldProducts.Position=1 and 
    oldProducts.Customer=$shop"; 


Indexes for NewProducts: 
Primary: Id 
Index: SKU, Title, customer (not unique) 

Indexes for OldProducts: 
Primary: Id 
Index: Product_id (not unique) 
Index: SKU, Title, Postition, Customer (not unique) 

?> 

CREATE TABLE `NewProducts` (
`Id` bigint(11) NOT NULL, 
`Title` varchar(120) COLLATE utf8_unicode_ci NOT NULL, 
`Category` varchar(100) COLLATE utf8_unicode_ci NOT NULL, 
`Office` varchar(150) COLLATE utf8_unicode_ci NOT NULL, 
`Rehashed` smallint(6) NOT NULL, 
`Quantity` smallint(6) NOT NULL, 
`Price1` decimal(7,2) NOT NULL, 
`Price2` decimal(7,2) NOT NULL, 
`Price3` decimal(7,2) NOT NULL, 
`Price4` decimal(7,2) NOT NULL, 
`created_at` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL, 
`OldQuantity` int(11) NOT NULL, 
`SKU` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL, 
`Source` varchar(12) COLLATE utf8_unicode_ci NOT NULL, 
`customer` varchar(70) COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`Id`), 
UNIQUE KEY `I-T-S` (`ItemId`,`Title`,`SKU`), 
KEY `customer` (`customer`), 
KEY `Title` (`Title`,`Rehashed`), 
KEY `SKU` (`SKU`), 
KEY `Title_2` (`Title`,`SKU`,`customer`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

CREATE TABLE `OldProducts` (
`barcode` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL, 
`compare_at_price` decimal(10,2) DEFAULT NULL, 
`created_at` varchar(30) COLLATE utf8_unicode_ci DEFAULT NULL, 
`fulfillment` varchar(35) COLLATE utf8_unicode_ci DEFAULT NULL, 
`grams` decimal(10,2) DEFAULT NULL, 
`id` bigint(11) NOT NULL, 
`management` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL, 
`policy` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL, 
`size` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL, 
`color` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL, 
`type` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL, 
`position` int(11) DEFAULT NULL, 
`price` varchar(15) COLLATE utf8_unicode_ci DEFAULT NULL, 
`product_id` bigint(11) NOT NULL, 
`SKU` varchar(55) COLLATE utf8_unicode_ci DEFAULT NULL, 
`Title` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL, 
`quantity` int(11) DEFAULT NULL, 
`customer` varchar(70) COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`id`), 
UNIQUE KEY `P-S-T-PO-CUST`  
(`product_id`,`SKU`,`Title`,`position`,`customer`), 
KEY `product_id` (`product_id`), 
+0

什麼是SKU?我不理解這個字段 –

+0

庫存單元 – user3314053

+0

您應該展示您現有的表格模式和'CREATEd INDEXes',可能甚至會顯示一段內容摘錄。還可以使用'EXPLAIN'來顯示查詢計劃。看來你應該清理存儲的ID並使用真正的JOIN而不是WHERE子句映射。 (雖然我們的SQL「人員」通常可以推斷出這樣的事情,但如果包含儘可能詳細的信息,它對未來的用戶會更有用。) – mario

回答

1

TRIM是小人。當您隱藏某個函數(例如,TRIM)中的索引列(例如,SKU)時,不能使用該索引。

清理數據:

  1. 插入之前修復所述插入代碼以TRIM(或作爲它插入)。
  2. UPDATE tbl SET SKU = TRIM(SKU), title = TRIM(title); - 爲每個表
  3. 更改SELECTTRIM(SKU) - >SKU

甚至更​​好

oldProducts應該有,順序

`INDEX(`position`,`customer` ,`SKU`,`Title`, `product_id`) 

有了這個,WHERE只需要oldposition=1 and customer =...。 (實際上,前2列可以是任意順序;最後3列是任意順序。)

+0

顯示第0 - 29行(共47977個查詢,花費0.0020秒)。槍的兒子......好快一點。謝謝先生,修剪的確是問題所在。 – user3314053

+0

我讓它更快;請參閱編輯。 –

+0

謝謝。你是我的英雄。 :) – user3314053