Ви обов'язково повинні витратити деякий час, читаючи на індексацію, про це багато написано, і важливо зрозуміти, що відбувається.
Загалом, індекс накладає впорядкування по рядках таблиці.
Для простоти, уявіть, що таблиця - це просто великий файл CSV. Щоразу, коли рядок вставляється, він вставляється в кінці . Тож "природне" впорядкування таблиці - це якраз порядок, у який вставляли рядки.
Уявіть, що у вас файл CSV завантажений у дуже рудиментарну програму електронних таблиць. Все, що ця електронна таблиця робить - це відображення даних та нумерація рядків у послідовному порядку.
Тепер уявіть, що у третьому стовпчику потрібно знайти всі рядки, які мають деяке значення "М". З огляду на те, що у вас є, у вас є лише один варіант. Ви скануєте таблицю, перевіряючи значення третього стовпця для кожного рядка. Якщо у вас багато рядків, цей метод («сканування таблиці») може зайняти багато часу!
Тепер уявіть, що крім цієї таблиці, у вас є індекс. Цей конкретний індекс - це індекс значень у третьому стовпці. Індекс перераховує всі значення з третього стовпця в певному змістовному порядку (скажімо, в алфавітному порядку) і для кожного з них подається список номерів рядків, де це значення відображається.
Тепер у вас є гарна стратегія пошуку всіх рядків, де значення третього стовпця "M". Наприклад, ви можете виконати двійковий пошук ! Оскільки сканування таблиці вимагає, щоб ви шукали N рядків (де N - кількість рядків), двійковий пошук вимагає лише перегляду записів індексу log-n, в найгіршому випадку. Ого, це точно набагато простіше!
Звичайно, якщо у вас є цей індекс, і ви додаєте рядки до таблиці (наприкінці, оскільки саме так працює наша концептуальна таблиця), вам потрібно щоразу оновлювати індекс. Таким чином, ви робите трохи більше роботи, поки пишете нові рядки, але заощаджуєте багато часу, шукаючи щось.
Отже, загалом, індексація створює компроміс між ефективністю читання та ефективністю запису. Без індексів вставки можуть бути дуже швидкими - двигун бази даних просто додає рядок до таблиці. Коли ви додаєте індекси, двигун повинен оновлювати кожен індекс під час виконання вставки.
З іншого боку, читання стає набагато швидшим.
Сподіваємось, це стосується ваших перших двох питань (як відповіли інші - вам потрібно знайти правильний баланс).
Ваш третій сценарій трохи складніший. Якщо ви використовуєте LIKE, двигуни індексації, як правило, допоможуть зі швидкістю читання до першого "%". Іншими словами, якщо ви вибираєте, де стовпець НЕОБХІДНОСЬОГО foo% bar% ', база даних використовує індекс, щоб знайти всі рядки, де стовпець починається з "foo", а потім потрібно сканувати цей проміжний набір рядків, щоб знайти підмножину що містить "бар". ВИБІР ... ГДО, де стовпець LIKE '% bar%' не може використовувати індекс. Я сподіваюся, ви можете зрозуміти, чому.
Нарешті, вам потрібно почати думати про індекси на декількох стовпцях. Концепція така ж, і поводиться аналогічно речей LIKE - по суті, якщо у вас є індекс на (a, b, c), двигун продовжить використовувати індекс зліва направо якнайкраще. Таким чином, для пошуку за стовпцем a може використовуватися індекс (a, b, c), як і на (a, b). Однак двигуну потрібно було б сканувати повну таблицю, якщо ви шукали, де б = 5 І с = 1)
Сподіваюсь, це допомагає пролити трохи світла, але я хочу ще раз зазначити, що вам найкраще витратити кілька годин на копання навколо хороших статей, які пояснюють ці речі глибоко. Також непогано прочитати документацію вашого конкретного сервера баз даних. Те, як індекси реалізуються та використовуються планувальниками запитів, може відрізнятися досить сильно.