У меня есть запрос на соединение, обработка которого занимает много времени.
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'));
Это в первую очередь потому, что в таблице "клиенты" есть 2 миллиона записей.
Я мог go в индексирование и т.д. c. Но, что еще важнее, эти 2,5 миллиона могут стать миллиардом записей за 1 день.
Я ищу решения, которые могут повысить производительность. Я подумал о
а) горизонтальной масштабируемости. -: распределите таблицу mysql по разным разделам и запросите счет независимо.
b) используя составные индексы.
c) Мой любимый -: Просто создайте отдельную коллекцию в mongodb или redis, который содержит только счетчик (вывод этого запроса), так как счетчик - только 1 число. это не потребует огромного размера, а также лучшей производительности запросов (вопрос только в том, сколько таких запросов, потому что это увеличит размер новой коллекции)