很慢我有一個複合鍵表CUSTOMER_PRODUCT_XREFMySQL查詢運行復合鍵表
__________________________________________________________________
|CUSTOMER_ID (PK NN VARCHAR(191)) | PRODUCT_ID(PK NN VARCHAR(191))|
-------------------------------------------------------------------
在我的批處理程序,我需要選擇500個更新的客戶,也得到了PRODUCT_ID的由逗號分隔的客戶購買並更新我們的SOLR索引。在我詢問我選擇500個客戶,做左連接到CUSTOMER_PRODUCT_XREF
SELECT
customer.*, group_concat(xref.PRODUCT_ID separator ', ')
FROM
CUSTOMER customer
LEFT JOIN CUSTOMER_PRODUCT_XREF xref ON customer.CUSTOMER_ID=xref.CUSTOMER_ID
group by customer.CUSTOMER_ID
LIMIT 500;
編輯:運行上面的查詢,20分鐘後EXPLAIN QUERY
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE customer ALL PRIMARY NULL NULL NULL 74236 Using where; Using temporary; Using filesort
1 SIMPLE xref index NULL PRIMARY 1532 NULL 121627 Using where; Using index; Using join buffer (Block Nested Loop)
我迷路了連接異常。
我試着用下面的(子查詢),它需要1.7秒來得到結果,但仍然很慢。
SELECT
customer.*, (SELECT group_concat(PRODUCT_ID separator ', ')
FROM CUSTOMER_PRODUCT_XREF xref
WHERE customer.CUSTOMER_ID=xref.CUSTOMER_ID
GROUP BY customer.CUSTOMER_ID)
FROM
CUSTOMER customer
LIMIT 500;
編輯:解釋查詢產生
id select_type table type possible_keys key key_len ref rows Extra
1 PRIMARY customer ALL NULL NULL NULL NULL 74236 NULL
2 DEPENDENT SUBQUERY xref index NULL PRIMARY 1532 NULL 121627 Using where; Using index; Using temporary; Using filesort
問題
CUSTOMER_PRODUCT_XREF已經有兩列設置爲PRIMARY_KEY和NOT_NULL偏偏是我的查詢還是很慢?我認爲在列上使用主鍵就足以爲它創建索引。我需要進一步索引嗎?
DATABASE INFO:
- 所有的ID在我的數據庫是VARCHAR(191),因爲id也可以包含英文字母。
- 我正在使用utf8mb4_unicode_ci字符編碼
- 我正在使用SET group_concat_max_len:= @@ max_allowed_packet獲取每個客戶的最大數量的product_ids。建議在一個主要查詢中使用group_concat,這樣我就不必爲多個客戶執行多個單獨的查詢來獲取產品。
運行使用查詢【解釋】(http://dev.mysql.com/doc/refman/5.6/en /explain.html)並將該命令的結果添加到問題中,這將有助於人們(和您)瞭解正在發生的事情。但嚴重的是,191個字符的主鍵?你確定這不是一個過分的矯枉過正? :-) – fvu
嘗試在CUSTOMER_PRODUCT_XREF上創建一個非唯一索引,僅包括customer_id列。 – Tarik
使用INT主鍵可能更有效率(通過LONG方式),使用INT鍵而不是長鍵,您的191字符鍵是不同的列,而您的相關表使用INT鍵。 – Kickstart