All original content is created in Ukrainian. Not all content has been translated yet. Some posts may only be available in Ukrainian.Learn more

Що таке B-Tree (Balanced Tree)?

Post cover: Що таке B-Tree (Balanced Tree)?
Table of contentsClick link to navigate to the desired location
This content has not been translated yet.We're showing the original Ukrainian content below.
B-Tree (Balanced Tree) - це структура даних, яка використовується в базах даних для швидкого пошуку, вставки та видалення записів. Вона організована у вигляді дерева, де кожен вузол містить ключі та посилання на дочірні вузли. Всі ключі в одному вузлі впорядковані, а інші вузли містять самі дані або посилання на рядки таблиці. Головна перевага B-Tree - баланс: висота дерева залишається мінімальною, що забезпечує пошук за логарифмічний час.
Індекси в базах даних працюють саме на основі B-Tree (у PostgreSQL та MySQL за замовчуванням). Коли ви створюєте індекс на колонку, база даних будує дерево за значеннями цієї колонки. Це дозволяє швидко знаходити потрібні записи без повного сканування таблиці. Наприклад, запит WHERE email = '[email protected]' використовує індекс, щоб відразу перейти до вузла з потрібним email замість перевірки всіх рядків.
У Rails індекси створюються через міграції. Наприклад, у PostgreSQL:
class AddIndexToUsersEmail < ActiveRecord::Migration[7.0]
  def change
    add_index :users, :email, unique: true
  end
end
Цей індекс забезпечує швидкий пошук користувача за email і гарантує унікальність значень. У MySQL синтаксис міграції такий самий, бо Rails абстрагує конкретну СУБД.
Внутрішньо база будує B-Tree за значеннями колонки email, і будь-який пошук через цей індекс проходить по вузлах дерева, а не по всій таблиці. Це значно підвищує швидкість запитів, особливо на великих таблицях.

Чи видно ці індекси в бд?

Якщо коротко - так. Але є нюанс. Індекси в базі даних видно, хоча вони не зберігаються як окремі таблиці у звичному сенсі. Кожна СУБД надає способи подивитися, які індекси існують на таблиці та їх властивості.
У PostgreSQL можна подивитися індекси через команду:
\d users
або через системні каталоги:
SELECT indexname, indexdef
FROM pg_indexes
WHERE tablename = 'users';
Це покаже назви індексів, колонки, на яких вони створені, та тип індексу (B-Tree за замовчуванням).
У MySQL індекси можна подивитися так:
SHOW INDEX FROM users;
Тут буде список всіх індексів таблиці users, колонки, тип індексу (BTREE або інший), унікальність та порядок сортування.
У Rails можна подивитися індекси через консоль:
ActiveRecord::Base.connection.indexes(:users)
Вивід покаже масив об’єктів з інформацією про кожен індекс: назва, колонки, унікальність.
Тобто індекси реально існують у базі, і до них можна звертатися та аналізувати їх структуру, навіть якщо вони не відображаються як звичайна таблиця.

This post doesn't have any additions from the author yet.

Різниця між blank?, present?, empty? та nil? у Ruby
30 Oct 21:06

Різниця між blank?, present?, empty? та nil? у Ruby

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Middleware у Ruby on Rails і коли воно використовується
04 Nov 10:39

Що таке Middleware у Ruby on Rails і коли воно використовується

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Vanilla Rails approach?
14 Nov 16:48

Що таке Vanilla Rails approach?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке Elasticsearch і як він працює?
22 Nov 12:35

Що таке Elasticsearch і як він працює?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
Що таке time-series база даних?
22 Nov 12:42

Що таке time-series база даних?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska
22 Nov 12:49

Що таке VACUUM у PostgreSQL?

Нотатки про Ruby та RoR
Нотатки про Ruby та RoR@kovbaska