Я должен запустить 2 простых запроса на очень большой таблице, состоящей приблизительно из 20 миллионов строк.
Столбцы таблицы: id|user_id|earned_amount|created_at
Запрос 1:
select user_id, sum(earned_amount) as total_earning
from earning_history
where user_id=XX;
Запрос 2:
SELECT date(created_at) date, sum(earned_amount) as earning, count(id) as total_entry
FROM 'earning_history'
where user_id=xx
GROUP by date
Мне нужно выполнить второй запрос больше, чем первый. Поэтому я думаю об индексировании user_id
и created_at
;
Без индексации для выполнения второго запроса требуется около 6-7 секунд. Мой вопрос в том,
Должен ли я индексировать только столбец user_id? Или мне нужно индексировать оба user_id
и created_at
?
Должен ли я использовать множественный индекс столбца, например => ALTER TABLE earning_history ADD INDEX (user_id, created_at);
?
Если id
может быть NULL
, скажите COUNT(*)
вместо id
. Тогда оптимальным индексом для обоих запросов является следующий порядок:
INDEX(user_id, earned_amount, created_at)
Оба запроса будут использовать его как "покрытый" индекс. Оба требуют, чтобы user_id
был первым - чтобы удовлетворить WHERE
. Первый запрос будет использовать только первые два столбца с незначительными издержками из-за неиспользуемого третьего столбца. Во втором запросе не волнует, в каком порядке находятся 2-й и 3-й столбцы, я выбрал этот порядок, чтобы сделать один INDEX
для обоих.
Два отдельных индекса с одним столбцом не будут такими эффективными. MySQL, вероятно, будет использовать только один индекс, и он будет (user_id)
. Затем он должен был бы отскочить между BTree, содержащим индекс, и BTree, содержащим все столбцы, - чтобы получить хотя бы earned_amount
. "Покрытие" позволяет избежать этого подпрыгивания.
Вы можете использовать составной индекс как для быстрого доступа, так и для уменьшения доступа к данным, извлекающим значения. вы можете использовать столбцы для где (user_id) и столбцы, используемые в select.
но для использования столбца в функции или в вычисленных столбцах обычно используются индексы
anyqwey вы должны иметь некоторые преимущества, используя и индексируя
create index my_index on my_table ( user_id, id, created_at, earned_amount)
или же
create index my_index on my_table ( user_id, created_at,id, earned_amount)