MySQL - почему бы не индексировать каждое поле? - PullRequest
88 голосов
/ 27 марта 2011

Недавно я изучил чудо индексов, и производительность значительно улучшилась.Однако, несмотря на все, что я узнал, я не могу найти ответ на этот вопрос.

Индексы великолепны, но почему кто-то не может просто проиндексировать все поля, чтобы сделать таблицу невероятно быстрой?Я уверен, что есть веская причина не делать этого, но как насчет трех полей в таблице из тридцати полей?10 в 30 поле?Где провести черту и почему?

Ответы [ 6 ]

103 голосов
/ 27 марта 2011

Индексы занимают место в памяти (RAM);Слишком много или слишком большое количество индексов, и БД придется обменивать их с диска.Они также увеличивают время вставки и удаления (каждый индекс должен обновляться для каждой вставленной / удаленной / обновленной части данных).

У вас нет бесконечной памяти.Делать так, чтобы все индексы помещались в RAM = хорошо.

У вас нет бесконечного времени.Индексирование только тех столбцов, которые вам нужны, сводит к минимуму снижение производительности вставки / удаления / обновления.

20 голосов
/ 27 марта 2011

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

Кроме того, каждый индекс занимает дополнительное дисковое пространство и пространство памяти (при вызове), поэтому он может потенциально замедлять операции чтения (для больших таблиц). Проверьте это

9 голосов
/ 27 марта 2011

Вы должны сбалансировать потребности CRUD.Запись в таблицы становится медленной.Что касается того, где провести черту, это зависит от того, как обрабатываются данные (фильтрация сортировки и т. Д.).

1 голос
/ 28 августа 2013

Индексация займет больше выделенного пространства как у привода, так и у оперативной памяти, но также значительно повысит производительность. К сожалению, когда он достигнет предела памяти, система уступит место на диске и рискует производительностью. Практически не следует индексировать никакие поля, которые, как вы думаете, не включают ни в какой алгоритм обработки данных, ни вставки, ни поиска (предложение WHERE). Но вы должны, если иначе. По умолчанию вы должны проиндексировать все поля. Поля, которые вы должны учитывать при удалении, это если запросы используются только модератором, если только они не нужны для скорости тоже

0 голосов
/ 03 марта 2019

этот ответ основан на моем личном мнении. Я использую свою математическую логику, чтобы ответить

второй вопрос был о границе, где остановиться. Сначала давайте сделаем некоторый математический расчет, предположим, что у нас есть N строк с L полями в таблице, если мы проиндексируем все поля, мы получим L новых индексных таблиц, где каждая таблица будет Сортируйте осмысленно данные поля индекса, на первый взгляд, если ваша таблица имеет вес W, она станет W * 2 (1 тера станет 2 тера), если у вас 100 больших таблиц (я уже работал в проекте, где номер стола был около 1800 (таблица) вы потратите в 100 раз больше места (100 тера), это далеко не мудро.

Если мы будем применять индексы во всех таблицах, нам придется подумать об обновлениях индексов, если один запуск запускает обновление всех индексов, то это выбор всех неупорядоченных эквивалентов во времени

Исходя из этого, я прихожу к выводу, что в этом сценарии, если вы потеряете это время, предпочтительнее потерять его в выборе или обновлении, потому что, если вы выберете поле, которое не проиндексировано, вы не активируете другой выбор для всех поля, которые не проиндексированы

что индексировать?

внешние ключи: является обязательным на основе

первичный ключ: я еще не уверен в этом, может быть, кто-то прочитает это, может помочь в этом случае

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

из этих 3 пунктов я могу заключить, что если у нас есть L полей, состоящих из K ключей, предел должен быть где-то около ((L-K)/2)+K более или менее на L / 10

этот ответ основан на моей логике и личных ценах

0 голосов
/ 09 июня 2018

Не рекомендуется индексировать все столбцы в таблице.Хотя это сделает таблицу очень быстрой для чтения, она также станет намного медленнее для записи.Запись в таблицу, в которой каждый столбец проиндексирован, потребует помещения новой записи в эту таблицу и последующего размещения информации о каждом столбце в отдельной индексной таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...