Подтвердить что ты не робот

Показатель MySQL: производительность и эффективность хранения

Скажем, у вас есть таблица MySQL MyISAM MySQL со 100 миллионами строк с одним индексом (кроме первичного ключа) на двух целых столбцах.

Из моего, по общему признанию, плохого понимания структуры B-дерева, я считаю, что более низкая мощность означает, что эффективность хранения индекса лучше, потому что меньше родительских узлов. В то время как более высокая мощность означает менее эффективное хранилище, но более высокую скорость чтения, поскольку она должна перемещаться по нескольким ветвям, чтобы получить любые данные, которые она ищет, чтобы сузить строки для запроса.

(Примечание - по "низким" и "высоким", я не имею в виду, например, 1 миллион против 99 миллионов для таблицы в 100 миллионов строк. Я имею в виду более 90 миллионов против 95 миллионов)

Правильно ли я понимаю?

Связанный вопрос - Как влияет мощность на производительность записи?

4b9b3361

Ответ 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, мощность столбца не влияет на производительность записи индекса.