Ответ 1
В то время как более высокая мощность означает менее эффективное хранилище, но более высокую производительность чтения, поскольку она должна перемещаться по нескольким ветвям, чтобы получить любые данные, которые она ищет, чтобы сузить строки для запроса.
Более высокая мощность означает лучшую производительность чтения, поскольку по определению меньше записей для чтения.
Обработать запрос следующим образом:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
двигатель должен выполнить следующие шаги:
-
Найдите первую запись, удовлетворяющую условию.
Это выполняется при перемещении
B-Tree
, начиная с корневой записи.Через страницы поиск выполняется с помощью следующих
B-Tree
ссылок; в пределах страницы поиск выполняется с помощью двоичного поиска (если только ваши клавиши не сжаты, и в этом случае это линейный поиск).Этот алгоритм обладает одинаковой эффективностью для столбцов с высокой мощностью и низкой мощностью. Поиск первого
3
(в отличие от любого3
) в этих списках:1 2 3 4 5 6 7 8 9 10 3 3 3 3 3 3 3 3 4 4
требует выполнения тех же
O(log(n))
шагов. -
Перемещение индекса до тех пор, пока значение ключа не изменится. Это, конечно, требует линейного времени: чем больше записей у вас есть, тем больше вам нужно пройти.
Если вам нужна только первая запись:
SELECT *
FROM mytable
WHERE indexed_col = @myvalue
LIMIT 1
мощность столбца не влияет на производительность чтения.
Как влияет мощность на производительность записи?
Каждый индексный ключ имеет скрытое дополнительное значение: указатель записи. В этом весь смысл иметь индекс: вам нужно знать, на какой записи он указывает.
Поскольку указатель записи по определению уникален, каждый индексный ключ тоже уникален. Записи индекса, имеющие одно и то же значение ключа, сортируются указателем записи.
Это необходимо для поддержания индекса: если вы удаляете запись со значением индексированного столбца, разделяемого миллионом других записей, соответствующая индексная запись также должна быть удалена. Но весь миллион индексных записей не просматривается: вместо этого указатель записи используется как дополнительное условие поиска.
Каждый индексный ключ на самом деле уникален (даже если вы не определяете индекс как уникальный) и, следовательно, имеет максимальную мощность.
Итак, ответ на ваши вопросы: no, мощность столбца не влияет на производительность записи индекса.