индексация по одному столбцу против индексации по нескольким столбцам

0

Я должен запустить 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 секунд. Мой вопрос в том,

  1. Должен ли я индексировать только столбец user_id? Или мне нужно индексировать оба user_id и created_at?

  2. Должен ли я использовать множественный индекс столбца, например => ALTER TABLE earning_history ADD INDEX (user_id, created_at); ?

  • 0
    может быть, вы можете запустить какой-нибудь тест, сравнивая время без индекса, один индекс для user_id и два индекса для user_id и create_ad, но я не уверен, что индекс действительно полезен для группы по полю: stackoverflow.com/questions/1445071/…
Теги:
mariadb

2 ответа

0

Если id может быть NULL, скажите COUNT(*) вместо id. Тогда оптимальным индексом для обоих запросов является следующий порядок:

INDEX(user_id, earned_amount, created_at)

Оба запроса будут использовать его как "покрытый" индекс. Оба требуют, чтобы user_id был первым - чтобы удовлетворить WHERE. Первый запрос будет использовать только первые два столбца с незначительными издержками из-за неиспользуемого третьего столбца. Во втором запросе не волнует, в каком порядке находятся 2-й и 3-й столбцы, я выбрал этот порядок, чтобы сделать один INDEX для обоих.

Два отдельных индекса с одним столбцом не будут такими эффективными. MySQL, вероятно, будет использовать только один индекс, и он будет (user_id). Затем он должен был бы отскочить между BTree, содержащим индекс, и BTree, содержащим все столбцы, - чтобы получить хотя бы earned_amount. "Покрытие" позволяет избежать этого подпрыгивания.

0

Вы можете использовать составной индекс как для быстрого доступа, так и для уменьшения доступа к данным, извлекающим значения. вы можете использовать столбцы для где (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)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню