C, PHP, VB, .NET

Дневникът на Филип Петров


* Покриващи индекси

Публикувано на 12 декември 2023 в раздел Бази от Данни.

Разработчици знаят, че тежките заявки могат да подобрят значително бързодействието си при наличие на индекси при колоните, които участват в условието WHERE. Това обикновено води до значително подобрение. Има обаче една техника, която може да ускори нещата дори още повече. Нарича се „покриващи индекси“.

Идеята зад покриващите индекси е да се индексира по всички колони, които участват както в WHERE, така и в SELECT частта на заявката. Нека например имаме таблица users със следните колони: id, username, password и registered_at. Да речем, че ни е нужен списък с потребителските имена на хората, които са се регистрирали през 2022 г. Можем да направим следната заявка:

SELECT username
FROM users
WHERE registered_at >= "2022-01-01 00:00:00" 
         AND 
      registered_at <= "2022-12-31 23:59:59";

Ако индексът е само върху registered_at (*), той ще бъде използван, а след това ще се направят дискови операции за достъп до таблицата, с които ще се прочетат съответните потребителски имена. Тези дискови операции биха могли да бъдат спестени ако индексът се направи по (registered_at, username). Имайте предвид, че последователността е важна – трябва да се направи първо по условието в WHERE, а след това да се изредят колоните в SELECT. Тогава практически всички данни ще бъдат прочетени директно от индекса. Разбира се е важно колоните от текстови тип, които се извличат, да бъдат с достатъчно къси, за да могат да бъдат индексирани в цялост. Тази техника не може да работи за големи обеми от текст.

(*) В MySQL и MariaDB винаги вторичните индекси са съставни, като в тях накрая се добавя първичния ключ по подразбиране. Тоест ако направите индекс по registered_at, този индекс всъщност ще бъде по (registered_at, id). Аналогично индексът по (registered_at, username) ще бъде всъщност индекс по (registered_at, username, id).

 

 

 



Добави коментар

Адресът на електронната поща няма да се публикува


*