Що таке індекс у SQL?


440

Що таке індекс у SQL? Чи можете ви пояснити чи посилатися, щоб зрозуміти чітко?

Де я повинен використовувати індекс?

Відповіді:


377

Індекс використовується для прискорення пошуку в базі даних. У MySQL є хороша документація з цього питання (що актуально і для інших серверів SQL): http://dev.mysql.com/doc/refman/5.0/en/mysql-indexes.html

Індекс може бути використаний для ефективного пошуку всіх рядків у відповідності до деякого стовпця у вашому запиті, а потім для проходження лише тієї підмножини таблиці, щоб знайти точні збіги. Якщо у вас немає індексів у жодному стовпчику цього WHEREпункту, SQLсервер повинен пройти всю таблицю і перевірити кожну рядок, щоб побачити, чи відповідає вона, що може бути повільною роботою на великих таблицях.

Індекс також може бути UNIQUEіндексом, що означає, що ви не можете мати дублікати значень у цьому стовпці, або PRIMARY KEYякий у деяких двигунах зберігання даних визначає, де у файлі бази даних зберігається значення.

У MySQL ви можете використовувати EXPLAINперед своїм SELECTвисловлюванням, щоб дізнатися, чи буде використовувати ваш запит який-небудь індекс. Це гарний початок для усунення неполадок із продуктивністю. Детальніше читайте тут: http://dev.mysql.com/doc/refman/5.0/uk/explain.html


"Індекс також може бути унікальним індексом ..." Тільки для підтвердження з вами, чи означає це, що індекс може бути не-Унікальним? Я завжди думав, що це УНІКАЛЬНО. Я зовсім новачок у SQL, вибачте мене
Даніель Курняді

@DanielKurniadi Більшість індексів не є унікальними. Я, можливо, маю базу даних користувачів і хочу запитати всіх, хто живе в Гетеборзі. Індекс на полі "місто" пришвидшив би моє запит. Але в Гетеборзі живе більше одного користувача, тому індекс повинен бути унікальним.
Еміль Вікстрем

174

Кластерний індекс схожий на вміст телефонної книги. Ви можете відкрити книгу за адресою "Хілдіч, Девід" і знайти всю інформацію для всіх "Hilditch" поруч. Тут ключі кластерного індексу (прізвище, ім’я).

Це робить кластерні індекси чудовими для отримання великої кількості даних на основі запитів на основі діапазону, оскільки всі дані розташовані поруч.

Оскільки кластерний індекс насправді пов'язаний із тим, як зберігаються дані, для кожної таблиці можливий лише один (хоча ви можете накрутити, щоб імітувати кілька кластерних індексів).

Некластерний індекс відрізняється тим, що їх можна мати багато, і вони потім вказують на дані кластерного індексу. Ви можете мати, наприклад, некластеризований індекс на звороті телефонної книги, на яку вводиться ключ (місто, адреса)

Уявіть собі, якби вам довелося шукати в телефонній книзі всіх людей, які живуть у "Лондоні" - за допомогою лише кластерного індексу вам доведеться шукати кожен окремий елемент у телефонній книзі, оскільки ключ у кластерному індексі включений (прізвище, ім'я) і, як наслідок, люди, які живуть у Лондоні, розкидані випадковим чином по індексу.

Якщо у вас некластеризований індекс на (місто), ці запити можна виконати набагато швидше.

Сподіваюся, що це допомагає!


151

Дуже хороша аналогія - мислити індекс бази даних як індекс у книзі. Якщо у вас є книга про країни, і ви шукаєте Індію, то чому б ви перегортали всю книгу - що є еквівалентом повного сканування таблиці в термінології бази даних - коли ви можете просто перейти до індексу в задній частині книга, яка розповість точні сторінки, де можна знайти інформацію про Індію. Так само, як індекс книги містить номер сторінки, індекс бази даних містить вказівник на рядок, що містить значення, яке ви шукаєте у своєму SQL.

Детальніше тут


2
Я захоплююсь досвідченими хлопцями, які пояснюють речі, використовуючи "аналогії". +1
snr

82

Індекс використовується для прискорення виконання запитів. Це робиться за рахунок зменшення кількості сторінок даних БД, які потрібно відвідати / відсканувати.

У SQL Server кластерний індекс визначає фізичний порядок даних у таблиці. На одну таблицю може бути лише один кластерний індекс (кластерний індекс - це таблиця). Всі інші індекси в таблиці називаються некластеризованими.


49

Індекси - це швидке пошуку даних .

Індекси в базі даних аналогічні індексам, які ви знайдете в книзі. Якщо книга має індекс, і я прошу знайти розділ у цій книзі, ви можете швидко знайти це за допомогою індексу. З іншого боку, якщо книга не має покажчика, вам доведеться витратити більше часу на пошуки глави, переглядаючи кожну сторінку від початку до кінця книги.

Аналогічно індекси в базі даних можуть допомогти запитам швидко знаходити дані. Якщо ви новачок у індексах, наступні відео можуть бути дуже корисними. Насправді я багато чого навчився від них.

Основи індексів
Кластеризовані та некластеризовані індекси
Унікальні та не унікальні індекси
Переваги та недоліки індексів


Прочитавши всі відповіді, змусило мене замислитися, чому б не індексувати все. +1 за включення посилання, що містить недоліки.
Лакшай Гарг

@LakshayGarg Іноді непотрібна індексація також може сповільнити час виконання запиту, тому ми не повинні намагатися все індексувати. Як і у всіх, є свої плюси і мінуси.
Gaurav Rajdeo

@LakshayGarg Gaurav Rajdeo має рацію. Занадто дотримуйтесь тієї ж аналогії: Ви можете проіндексувати кожну главу чи рисунок чи таблицю в книзі, але не кожен абзац, речення чи слово. Зазвичай це було б надмірним і призведе до зайвих ускладнень. Сподіваємось, що це досить близько до намальованої картини в цій відповіді.
colidyre

23

Ну загалом індекс - це B-tree . Існує два типи індексів: кластерні та некластеризовані.

Скупчений індекс створює фізичний порядок рядків (він може бути лише одним, і в більшості випадків це також первинний ключ - якщо ви створюєте первинний ключ у таблиці, ви також створюєте кластерний індекс у цій таблиці).

Некластеризований індекс також є двійковим деревом, але він не створює фізичний порядок рядків. Отже, вузли листя некластеризованого індексу містять PK (якщо він існує) або індекс рядків.

Індекси використовуються для збільшення швидкості пошуку. Оскільки складність становить O (log N). Показники - дуже велика і цікава тема. Я можу сказати, що індекси для великої бази даних іноді є видом мистецтва.


6
загалом, це b-дерево, а не двійкове дерево.
Мітч Пшеничний

Отже, оскільки індекси використовують дерева, що самоврівноважують, щоразу, коли ви додаєте / видаляєте рядок, він врівноважить себе - зробивши вставлення / видалення дорожчим ... правильно?
Девід Рефаелі

20

INDEXES - легко знайти дані

UNIQUE INDEX - копії значень не дозволені

Синтаксис для INDEX

CREATE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

Синтаксис для UNIQUE INDEX

CREATE UNIQUE INDEX INDEX_NAME ON TABLE_NAME(COLUMN);

13

Спершу нам потрібно зрозуміти, як працює нормальний (без індексування) запит. В основному він проходить кожен рядок один за одним, і коли він знаходить дані, він повертається. Перегляньте наступне зображення. (Це зображення було взято з цього відео .)

Без індексування Отже, припустимо, що запит повинен знайти 50, він повинен буде прочитати 49 записів як лінійний пошук.

Перегляньте наступне зображення. (Це зображення було взято з цього відео )

введіть тут опис зображення

Коли ми застосуємо індексацію, запит швидко з’ясує дані, не зчитуючи кожного з них, лише видаливши половину даних у кожному обході, як двійковий пошук. Індекси mysql зберігаються як B-дерево, де всі дані знаходяться у вузлі аркуша.


12

INDEX - це технологія оптимізації продуктивності, яка прискорює процес пошуку даних. Це стійка структура даних, пов'язана з Таблицею (або Переглядом), щоб підвищити продуктивність під час отримання даних із цієї таблиці (або Перегляду).

Пошук на основі індексу застосовується більш конкретно, коли ваші запити містять фільтр WHERE. В іншому випадку, тобто запит без фільтра WHERE вибирає цілі дані та обробляє. Пошук цілої таблиці без INDEX називається скануванням таблиці.

Ви знайдете точну інформацію про Sql-індекси зрозумілим і надійним: перейдіть за цими посиланнями:

  1. Для розумного розуміння: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Overview-and-Optimizations.html
  2. Для розуміння з точки зору реалізації: http://dotnetauthorities.blogspot.in/2013/12/Microsoft-SQL-Server-Training-Online-Learning-Classes-INDEX-Creation-Deletetion-Optimizations.html

6

Індекс використовується за кількома різних причин. Основна причина - пришвидшити запит, щоб ви могли швидше отримувати рядки або сортувати рядки. Ще одна причина - визначити первинний ключ або унікальний індекс, який гарантуватиме, що жоден інший стовпець не має однакових значень.


6

Якщо ви використовуєте SQL Server, один з найкращих ресурсів - це його власні Книги онлайн, які постачаються з встановленням! Це 1 місце, на яке я б посилався на будь-які теми, пов'язані з SQL Server.

Якщо це практично "як мені це зробити?" питань, тоді StackOverflow буде кращим місцем для запитання.

Також я деякий час не повертався, але sqlservercentral.com був одним із найкращих сайтів, пов’язаних із SQL Server.


0

Індекс - це on-disk structure associated with a table or view that speeds retrieval of rows from the table or view. Індекс містить ключі, побудовані з одного або декількох стовпців таблиці або подання. Ці ключі зберігаються у структурі (B-tree), яка дозволяє SQL Server швидко та ефективно знаходити рядок або рядки, пов’язані зі значеннями ключів.

Indexes are automatically created when PRIMARY KEY and UNIQUE constraints are defined on table columns. For example, when you create a table with a UNIQUE constraint, Database Engine automatically creates a nonclustered index.

Якщо ви налаштовуєте PRIMARY KEY, Database Engine автоматично створює кластерний індекс, якщо тільки кластерний індекс вже не існує. Коли ви намагаєтесь застосувати обмеження PRIMARY KEY для існуючої таблиці, а кластерний індекс вже існує в цій таблиці, SQL Server виконує первинний ключ, використовуючи некластеризований індекс.

Зверніться до цього, щоб отримати докладнішу інформацію про індекси (кластеризовані та не кластеризовані): https://docs.microsoft.com/en-us/sql/relational-databases/indexes/clustered-and-nonclustered-indexes-described?view= sql-server-ver15

Сподіваюся, це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.