Уникальные индексы лучше для выполнения поиска столбца? (PGSQL & MySQL)

В некоторых ситуациях Ваш бизнес требует создания новых объектов, но в то же время бизнес-логики на основе некоторых фиксированных объектов. Для фиксированных Вы хотите перечисление, новые, очевидно, требуют некоторого набора/дб.

я видел проекты использовать набор для этого вида объектов, приводя к бизнес-логике в зависимости от данных, которые могут быть удалены пользователем. Никогда не делайте это, но действительно создайте отдельное перечисление для фиксированных и набор для других, столь же требуемых.

другое решение состоит в том, чтобы использовать набор с неизменными объектами для фиксированных значений. Эти объекты могли также находиться в дб, но иметь дополнительный флаг, таким образом, пользователи не могут обновить / удаляют его.

21
задан Alex Balashov 18 August 2009 в 01:22
поделиться

2 ответа

Если ваши данные уникальны, вы должны создать для них индекс UNIQUE .

Это не подразумевает дополнительных накладных расходов и в некоторых случаях влияет на решения оптимизатора, чтобы он мог выберите лучший алгоритм.

В SQL Server и в PostgreSQL , например, при сортировке по ключу UNIQUE оптимизатор игнорирует ] ORDER BY после этого используются предложения (поскольку они не имеют отношения к делу), то есть этот запрос:

SELECT  *
FROM    mytable
ORDER BY
        col_unique, other_col
LIMIT 10

будет использовать индекс для col_unique и не будет выполнять сортировку по other_col , потому что это бесполезно.

Этот запрос:

SELECT  *
FROM    mytable
WHERE   mycol IN
        (
        SELECT  othercol
        FROM    othertable
        )

также будет преобразован во INNER JOIN (в отличие от SEMI JOIN ), если есть UNIQUE указатель на othertable.othercol .

Индекс всегда содержит какой-то указатель на строку ( ctid в PostgreSQL , указатель на строку в MyISAM , первичный ключ / уникальный указатель в ] InnoDB ), и листья упорядочены по этим указателям, поэтому на самом деле каждый лист индекса уникален в некотором роде (хотя это может быть неочевидно).

См. Эту статью в моем блоге для получения подробной информации о производительности:

18
ответ дан 17 October 2019 в 01:52
поделиться

Ну, обычно индексы - это B-деревья, а не хеши (есть индексы на основе хешей, но самый распространенный индекс (по крайней мере, в PostgreSQL) основан на B Tree).

Что касается скорости - уникально должно быть быстрее - когда сканирование индекса находит строку с заданным значением, ему не нужно искать, есть ли другие строки с этим значением, и можно немедленно завершить сканирование.

но наиболее распространенный индекс (по крайней мере, в PostgreSQL) основан на дереве B).

Что касается скорости - уникальный должен быть быстрее - когда сканирование индекса находит строку с заданным значением, ему не нужно искать, есть ли какие-либо другие строки с этим значением, и сканирование можно завершить немедленно.

но наиболее распространенный индекс (по крайней мере, в PostgreSQL) основан на дереве B).

Что касается скорости - уникальный должен быть быстрее - когда сканирование индекса находит строку с заданным значением, ему не нужно искать, есть ли какие-либо другие строки с этим значением, и сканирование можно завершить немедленно.

2
ответ дан 17 October 2019 в 01:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: