У меня есть база данных Postgre и таблица my_table. В этой таблице 4 столбца (id
, column1
, column2
, column3
). Столбец id
является первичным ключом, для столбцов нет других ограничений или индексов.
В таблице около 200000 строк.
Я хочу распечатать все строки, у которых значение столбца column2
равно (без учета регистра) 'value12'
. Я использую это:
SELECT * FROM my_table WHERE column2 = lower('value12')
вот план выполнения для этого оператора (результат set enable_seqscan=on; EXPLAIN SELECT * FROM my_table WHERE column2 = lower('value12')
):
Seq Scan on my_table (cost=0.00..4676.00 rows=10000 width=55)
Filter: ((column2)::text = 'value12'::text)
Я считаю это медленным, поэтому я создаю индекс для столбца column2
для лучшей производительности поиска:
CREATE INDEX my_index ON my_table (lower(column2))
Теперь я запустил тот же выбор:
SELECT * FROM my_table WHERE column2 = lower('value12')
и я ожидаю, что это будет намного быстрее, потому что он может использовать индекс. Однако это не так быстро, как раньше. Поэтому я проверяю план выполнения, и он такой же, как и раньше (см. Выше). Так что он все еще использует последовательную сцену и игнорирует индекс! Где проблема?