Часть 5. Indexes Null or Not Null
Про нулловые индексы:
1️⃣ Если у вас есть нуллабельные поля и вы делаете по ним индексы, то делайте индексы с условием is not null. Особенно это пригодится, если вы делаете индекс по Foreign Key
2️⃣ Не забывать создавать ForeignKey это даст ускорение в 2055 раз и уменьшение размера в 14 раз. По умолчанию не создается. И я тут для себя подметил, что пожалуй это единственный индекс, который можно создать прям до того, как в таблицу польются данные.
Indexes Partial
1️⃣ Параллелить нагрузки в OLTP базах нельзя. То есть делать так, чтобы несколько потоков выполняли один запрос – это подходит для Аналитических баз, но не для процессинга транзакций – целиться нужно в то чтобы одна транзакция выполнялась как можно быстрее.
2️⃣Нужно быть с индексамы аккуратнее.
❌ Вот такой индекс не очень.
create index strange on sometable ((state == 'ожидание'));
Этот индекс будет идти по булевскому значению данного выражения, то есть по трем возможным значениям true false и null (если данных в поле нет). То есть по сути такой индекс будет мало фильтровать данных.
✅ Вместо этого стоит создавать индекс по нескольким полям:
create index strange on sometable (created_at) where state != 'обработано'
Это partial index. Офигенная фича так-то, то есть индекс строится не для всех строк таблицы, а только для тех, что указаны в условии. Это компактизирует индекс. К сожалению MySQL не поддерживает эту фичу, но я StackOverflow'ил вот такой обход этой проблемы.
3️⃣ Забавно, что вот такой вариант:
create index strange on sometable (created_at, state)
занимает чуть меньше места чем вот такой:
create index strange on sometable (state, created_at)
все дело в том, что такой вариант размажет данные по b-дереву чуть лучше. А разница в выполнении не существенная.