【发布时间】:2020-07-23 19:15:33
【问题描述】:
我有一个连接查询需要很长时间来处理。
SELECT
COUNT(c.id)
FROM `customers` AS `c`
LEFT JOIN `setting` AS `ssh` ON `c`.`shop_id` = `ssh`.`id`
LEFT JOIN `customer_extra` AS `cx` ON `c`.`id` = `cx`.`customer_id`
LEFT JOIN `customers_address` AS `ca` ON `ca`.`id` = `cx`.`customer_default_address_id`
LEFT JOIN `lytcustomer_tier` AS `ct` ON `cx`.`lyt_customer_tier_id` = `ct`.`id`
WHERE (c.shop_id = '12121') AND ((DATE(cx.last_email_open_date) > '2019-11-08'));
这主要是因为“客户”表有 200 万条记录。
我可以继续进行索引等。但是,更大的一点是,这 250 万条记录可能在 1 天变成十亿条记录。
我正在寻找可以提高性能的解决方案。 我已经考虑过了
a) 水平可扩展性。 -:将mysql表分布到不同的section,独立查询count。
b) 使用复合索引。
c)我最喜欢的一个 - :只需在 mongodb 或 redis 中创建一个单独的集合,它只包含计数(此查询的输出)因为,计数只是 1 个数字。这不需要很大的大小,也就是更好的查询性能(唯一的问题是,有多少这样的查询,因为这会增加新集合的大小)
【问题讨论】:
-
首先,既然你做了
AND ((DATE(cx.last_email_open_date) > '2019-11-08'));,那已经把customers表变成INNER JOIN和customer_extra表。所以也许你想把它改成FROM customers AS c INNER JOIN customer_extra AS cx ON ...,然后只有LEFT JOIN其他表? -
谢谢。将此作为答案。我会接受的
-
好的,但它会提高性能吗?如果有,改善了多少?
标签: mysql database mongodb performance cassandra