我有一个复合键表 CUSTOMER_PRODUCT_XREF
__________________________________________________________________
|CUSTOMER_ID (PK NN VARCHAR(191)) | PRODUCT_ID(PK NN VARCHAR(191))|
-------------------------------------------------------------------
在我的批处理程序中,我需要选择 500 个更新的客户,并获取 CUSTOMER 购买的 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;
编辑:解释查询
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)
运行上述查询 20 分钟后,我失去了连接异常。
我尝试了以下(子查询),需要 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 但为什么我的查询仍然很慢?我认为在列上有主键就足以为其建立索引。我需要进一步索引吗?
数据库信息:
- 我数据库中的所有 ID 都是 VARCHAR(191),因为 ID 可以包含字母。
- 我正在使用 utf8mb4_unicode_ci 字符编码
- 我正在使用 SET group_concat_max_len := @@max_allowed_packet 来获取每个客户的最大 product_id 数量。更喜欢在一个主查询中使用 group_concat,这样我就不必执行多个单独的查询来为每个客户获取产品。