Почему поиск быстрый с primary key

Ответ

Primary key обеспечивает быстрый поиск благодаря индексации. В SQLite (и большинстве БД) primary key автоматически создает clustered index, который физически упорядочивает данные на диске.

При поиске по primary key:

  1. Используется B-дерево (сбалансированное дерево поиска)
  2. Время поиска O(log n) вместо O(n) при полном сканировании
  3. Нет необходимости в дополнительных операциях JOIN или фильтрации

Пример с Room:

@Dao
interface UserDao {
    @Query("SELECT * FROM users WHERE id = :userId") // id - primary key
    suspend fun getUserById(userId: Int): User?
}

Оптимизации:

  • Автоматическое кэширование часто запрашиваемых PK
  • Минимальные накладные расходы при обновлении индекса
  • Поддержка быстрых операций CRUD

Ответ 18+ 🔞

Ну ты представляешь, как эта штука работает? Primary key — это вообще магия какая-то, ёпта. Берёт и делает твою таблицу не просто кучей записей, а этакой упорядоченной структурой, где всё лежит по полочкам. В SQLite (да и в других базах тоже) стоит тебе объявить primary key, как сразу накидывается clustered index. Это как если бы ты свои носки не в кучу в угол швырял, а аккуратно по ящикам разложил — и найти нужную пару можно за секунду.

Поиск по этому самому ключу — это просто песня, я тебе скажу. Вместо того чтобы перебирать всю таблицу построчно (это O(n), представляешь, какой пиздец при миллионе записей?), база использует B-дерево. Это такая хитрая древовидная структура, сбалансированная, где поиск происходит за O(log n). То есть ты за несколько шагов находишь нужную строчку, даже если их там овердохуища.

Вот смотри, как это в Room выглядит, чтоб совсем понятно было:

@Dao
interface UserDao {
    @Query("SELECT * FROM users WHERE id = :userId") // id - primary key
    suspend fun getUserById(userId: Int): User?
}

Видишь? Всё просто и элегантно. Никаких лишних телодвижений, JOIN'ов или сложных фильтраций — база сразу знает, куда смотреть.

А ещё какие плюшки идут в комплекте? Автоматическое кэширование тех ключей, к которым ты часто лезешь — чтобы в следующий раз вообще мгновенно. Обновление индекса происходит с минимальными танцами с бубном, и все основные операции CRUD летают просто как угорелые. В общем, primary key — это не просто ограничение целостности, а настоящий перфоманс-костыль, который выручает в самых жопных ситуациях.