Было бы лучше, если бы вы видели план выполнения самостоятельно.Добавьте EXPLAIN ANALYZE
перед оператором select и выполните оба, чтобы увидеть различия.
Вот как:
EXPLAIN ANALYZE select ...
Что это делает?Он фактически выполняет оператор выбора и возвращает план выполнения, который был выбран оптимизатором запросов.Без ключевого слова ANALYZE
он будет только оценивать план выполнения без фактического выполнения оператора в фоновом режиме.
База данных не будет использовать два индекса одновременно, поэтому наличие индекса на customer(id)
сделает его неспособнымиспользовать индекс на customer(reward_id)
.Это условие будет фактически рассматриваться как условие фильтра, которое является правильным поведением.
Вы можете поэкспериментировать с производительностью частичного индекса, созданного так: customer(id) where reward_id is not null
.Это уменьшит размер индекса, поскольку будет хранить только те идентификаторы клиентов, для которых назначен reward_id
.
Я обычно хотел бы отделить логику взаимосвязи / соединения от примененных условий, и я сам помещал их в WHERE
, потому что он более заметен и легче читается на будущее, если есть какие-либо изменения.
Я предлагаю вам самим убедиться в возможном выигрыше в производительности, потому что это зависит от объема данных и возможной низкой мощности для reward_id
.Например, если в большинстве строк этот столбец заполнен значением, это не будет иметь большого значения, так как размер индекса (обычный или частичный) будет почти одинаковым.