Що насправді робить база даних, щоб з’ясувати, що відповідає оператору select?
Якщо говорити прямо, це питання грубої сили. Просто, він читає кожен запис кандидата в базі даних і узгоджує вираз із полями. Отже, якщо у вас є "вибрати * з таблиці, де name = 'fred'", він буквально проходить через кожен запис, захоплює поле "name" і порівнює його з "fred".
Тепер, якщо поле "ім'я таблиці" індексується, то база даних (ймовірно, але не обов'язково) спочатку використовуватиме індекс, щоб знайти записи кандидатів, до яких застосовуватиметься фактичний фільтр.
Це зменшує кількість записів кандидатів, до яких слід застосувати вираз, інакше він буде просто робити те, що ми називаємо "скануванням таблиці", тобто читати кожен рядок.
Але принципово, однак він знаходить записи кандидатів окремо від того, як застосовується фактичний вираз фільтра, і, очевидно, є кілька розумних оптимізацій, які можна зробити.
Як база даних інтерпретує приєднання по-різному до запиту з кількома операторами "де ключ1 = ключ2"?
Ну, об'єднання використовується для створення нової "псевдо-таблиці", до якої застосовується фільтр. Отже, у вас є критерії фільтрації та критерії об’єднання. Критерії об'єднання використовуються для побудови цієї "псевдо-таблиці", а потім до неї застосовується фільтр. Тепер, при інтерпретації об'єднання, це знову та сама проблема, що і фільтр - порівняння грубих сил та зчитування індексу для побудови підмножини для "псевдо таблиці".
Як база даних зберігає всю свою пам’ять?
Одним із ключів хорошої бази даних є те, як вона управляє своїми буферами вводу-виводу. Але це в основному відповідає блокам оперативної пам'яті блокам диска. Завдяки сучасним менеджерам віртуальної пам'яті простіша база даних майже може покластися на ВМ як менеджер буфера пам'яті. Високоякісні БД все це роблять самі.
Як зберігаються індекси?
B + Дерева, як правило, вам слід це переглянути. Це пряма техніка, яка існує роками. Ця перевага ділиться з більшістю будь-якого збалансованого дерева: послідовний доступ до вузлів, а також всі листові вузли пов'язані, щоб ви могли легко переходити від вузла до вузла в порядку ключів. Отже, за допомогою індексу рядки можна вважати "відсортованими" для певних полів бази даних, і база даних може використовувати цю інформацію для користі для оптимізації. Це відмінне від, скажімо, використання хеш-таблиці для індексу, яка лише дозволяє швидко дістатися до певного запису. У B-Tree ви можете швидко дістатись не просто до певного запису, а до точки у відсортованому списку.
Фактична механіка зберігання та індексування рядків у базі даних насправді є досить прямою і добре зрозумілою. Гра управляє буферами та перетворює SQL на ефективні шляхи запитів, щоб використати ці основні ідіоми зберігання.
Потім, поверх ідіоми зберігання є ціла багатокористувацька, блокування, реєстрація та складність транзакцій.