1. Проблема ведущего Wildcard (LIKE '%smith%')
Представь B+ дерево как алфавитный указатель. Если ты ищешь всех на букву «Ива» (), ты быстро находишь раздел «И», потом «Ив» и читаешь Ивановых. Дерево отсортировано, индекс работает великолепно.LIKE 'Ива%'
А теперь представь, что тебе нужно найти (где-то в строке есть smith). Это может быть Aerosmith, Blacksmith или Goldsmith. Индекс отсортирован только по началу строки! База не знает, куда спускаться, поэтому она отключает индекс и делает полное сканирование таблицы (Full Scan), убивая производительность.LIKE '%smith%'
2. Фрагментация
После множества разделений (Node Splits) и удалений, узлы дерева редко заполнены на 100%. Обычно они полупустые. Это значит, что индекс на диске занимает больше места, чем сами полезные данные.
3. Конкуренция за корень
Абсолютно все операции (и чтение, и запись) начинаются с корня дерева. В высоконагруженных системах с тысячами параллельных транзакций этот корневой узел становится «узким горлышком» из-за блокировок доступа к памяти.
Применения B+ Tree
- MySQL (InnoDB): Использует B+ деревья для всех индексов. Более того, сами строки таблицы физически хранятся прямо в листьях главного B+ дерева! Это называется Кластерный индекс (Clustered Index) — о нем мы поговорим в следующих главах.
- PostgreSQL: Тоже живет на B+ деревьях, но с крутой фишкой — дедупликацией. Если у тебя есть тысяча строк со статусом
, Postgres не будет хранить слово 'active' тысячу раз в индексе. Он сохранит его один раз и привяжет к нему массив ссылок, экономя огромное количество памяти.'active'