Вы должны определенно потратить некоторое время на чтение по индексированию, об этом много написано, и важно понимать, что происходит.
Вообще говоря, индекс налагает порядок на строки таблицы.
Для простоты представьте, что таблица - это просто большой файл CSV. Всякий раз, когда вставляется строка, она вставляется в конце . Таким образом, «естественный» порядок таблицы - это просто порядок, в котором были вставлены строки.
Представьте, что вы загрузили этот CSV-файл в очень простое приложение для работы с электронными таблицами. Все, что делает эта электронная таблица, это отображает данные и нумерует строки в последовательном порядке.
Теперь представьте, что вам нужно найти все строки, имеющие некоторое значение «M» в третьем столбце. Учитывая, что у вас есть в наличии, у вас есть только один вариант. Вы сканируете таблицу, проверяя значение третьего столбца для каждой строки. Если у вас много строк, этот метод («сканирование таблицы») может занять много времени!
Теперь представьте, что в дополнение к этой таблице у вас есть индекс. Этот конкретный индекс является индексом значений в третьем столбце. Индекс перечисляет все значения из третьего столбца в некотором значимом порядке (скажем, в алфавитном порядке) и для каждого из них предоставляет список номеров строк, в которых отображается это значение.
Теперь у вас есть хорошая стратегия для поиска всех строк, где значение третьего столбца равно «M». Например, вы можете выполнить бинарный поиск ! В то время как сканирование таблицы требует, чтобы вы просматривали N строк (где N - количество строк), бинарный поиск требует только просмотра записей индекса log-n, в самом худшем случае. Вау, это намного проще!
Конечно, если у вас есть этот индекс, и вы добавляете строки в таблицу (в конце концов, так работает наша концептуальная таблица), вам необходимо обновлять индекс каждый раз. Таким образом, вы делаете немного больше работы, когда пишете новые строки, но вы экономите кучу времени, когда ищете что-то.
Таким образом, в целом индексирование создает компромисс между эффективностью чтения и эффективностью записи. Без индексов вставки могут быть очень быстрыми - ядро базы данных просто добавляет строку в таблицу. По мере добавления индексов движок должен обновлять каждый индекс при выполнении вставки.
С другой стороны, чтение становится намного быстрее.
Надеюсь, что это покрывает ваши первые два вопроса (как ответили другие - вам нужно найти правильный баланс).
Ваш третий сценарий немного сложнее. Если вы используете LIKE, механизмы индексирования обычно помогают увеличить скорость чтения до первого «%». Другими словами, если вы ВЫБИРАЕТЕ столбец WHERE LIKE 'foo% bar%', база данных будет использовать индекс, чтобы найти все строки, где столбец начинается с "foo", а затем потребуется просканировать этот промежуточный набор строк, чтобы найти подмножество. который содержит "бар". SELECT ... WHERE LIKE "% bar%" не может использовать индекс. Я надеюсь, вы понимаете, почему.
Наконец, вам нужно начать думать об индексах в нескольких столбцах. Концепция та же самая, и она ведет себя аналогично LIKE - по сути, если у вас есть индекс для (a, b, c), движок продолжит использовать индекс слева направо, как может. Таким образом, поиск по столбцу a может использовать индекс (a, b, c), как и поиск по (a, b). Тем не менее, движок должен был бы выполнить полное сканирование таблицы, если вы искали ГДЕ b = 5 И c = 1)
Надеюсь, это поможет пролить немного света, но я должен повторить, что вам лучше потратить несколько часов на поиски хороших статей, которые подробно объясняют эти вещи. Это также хорошая идея, чтобы прочитать документацию вашего конкретного сервера базы данных. То, как индексы реализуются и используются планировщиками запросов, может варьироваться довольно широко.