CREATE TABLE campaigns (
domain varchar(50) DEFAULT NULL,
campaign_id varchar(50) DEFAULT NULL,
node_id varchar(50) DEFAULT NULL,
subscriber_id varchar(50) DEFAULT NULL,
message varchar(21000) DEFAULT NULL,
log_time datetime DEFAULT NULL,
log_type varchar(50) DEFAULT NULL,
campaign_name varchar(500) DEFAULT NULL
KEY `campid_domain_logtype_logtime_subid_index` (`campaign_id`,`domain`,`log_type`,`log_time`,`subscriber_id`),
KEY `domain_logtype_logtime_index` (`domain`,`log_type`,`log_time`)
)
Вышеупомянутая схема нашей таблицы в MySql. Одна кампания может иметь несколько узлов.Как MySql обрабатывает составной индекс
Индекс campid_domain_logtype_logtime_subid_index
отлично работает с отчетами специальной кампании w.r.t.
Недавно мы добавили node_id в эту таблицу, теперь нам нужны отчеты w.r.t конкретного узла.
Так что теперь я планирую изменить наш индекс покрытия, как следующие для поддержки как на уровне кампании и уровень узла сообщает
campid_nodeid_domain_logtype_logtime_subid_index
.
Пример запроса для отчетов о конкретной кампании
SELECT log_type,
count(DISTINCT subscriber_id) AS count,
count(subscriber_id) AS total
FROM stats.campaign_logs USE INDEX(campid_domain_logtype_logtime_subid_index)
where domain = 'aaa' AND campaign_id='12345' AND
log_type in ('EMAIL_SENT','EMAIL_OPENED','EMAIL_CLICKED')
AND log_time BETWEEN CONVERT_TZ('2016-03-13 00:00:00','+01:30','+00:00') AND CONVERT_TZ('2016-04-13 23:59:59','+01:30','+00:00')
GROUP BY log_type;
Пример запроса для отчетов по конкретному идентификатору узла конкретной кампании
SELECT
log_type,
count(DISTINCT subscriber_id) AS count,
count(subscriber_id) AS total
FROM stats.campaign_logs USE INDEX(campid_domain_logtype_logtime_subid_index)
where domain='aaa' AND campaign_id='12345' AND
node_id = '56789' and
log_type in ('EMAIL_SENT','EMAIL_OPENED','EMAIL_CLICKED')
AND log_time BETWEEN CONVERT_TZ('2016-03-13 00:00:00','+01:30','+00:00') AND CONVERT_TZ('2016-04-13 23:59:59','+01:30','+00:00')
GROUP BY log_type;
Так что мой вопрос этот новый индекс эффективно удовлетворить наши как-то запросы если нет, предложите подходящие индексы.
ОБНОВЛЕНИЕ: Распределение
данных в таблице
1 Домен может иметь несколько кампаний, например 20
1 кампания может иметь несколько узлов, например 10
1 кампанию может иметь несколько типов журналов, например 50
1 Кампания может га у много абонентов, например, 100 000
1 Кампания может иметь много журнальных времен, так как мы используем mysql now() при хранении журнала.
UPDATE
Благодаря
Не могли бы вы добавить избирательность каждого поля - Сколько уникальных значений у него есть –
сколько доменов в вашем столе? –
сейчас arround 4k. некоторые домены имеют только несколько строк и некоторые домены, имеющие большое количество строк в таблице. – Rams