Сколько времени занимает обращение к записи в большой таблице базы данных?

«Сколько времени занимает обращение к записи в большой таблице базы данных?» — вопрос из категории Базы данных, который задают на 24% собеседований PHP Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Время доступа к записи в таблице с миллионами строк в первую очередь определяется наличием подходящего индекса.

С индексом (по первичному ключу или другому индексированному полю):

  • Сложность: O(log n), где n — количество записей. Для B-дерева (стандартная структура индекса в MySQL/PostgreSQL) это означает, что для поиска среди 10 млн записей потребуется всего ~23 сравнения (log2(10^7)).
  • Фактическое время: Обычно составляет менее 10 миллисекунд (часто 1-3 мс) для точечного запроса (WHERE id = ?), если данные находятся в оперативной памяти (InnoDB buffer pool).

Без индекса (или с неподходящим индексом):

  • Сложность: O(n). СУБД выполняет полное сканирование таблицы (Full Table Scan).
  • Фактическое время: Может занимать сотни миллисекунд или даже секунды на больших таблицах, так как необходимо прочитать с диска и проверить каждую строку.

Пример на SQL:

-- Быстро (~1-3 мс): используется индекс по первичному ключу `id`
SELECT * FROM users WHERE id = 123456;

-- Быстро (~1-10 мс): используется составной индекс `(department_id, status)`
SELECT * FROM orders WHERE department_id = 5 AND status = 'shipped';

-- Медленно (может быть >1000 мс): full scan, т.к. поиск по неиндексированному полю
SELECT * FROM users WHERE bio LIKE '%expert%';

-- Медленно (может быть >1000 мс): full scan, т.к. функция `UPPER()` не позволяет использовать индекс по `email`
SELECT * FROM users WHERE UPPER(email) = 'TEST@EXAMPLE.COM';

Вывод: Ключевой фактор производительности — правильное проектирование и использование индексов под реальную нагрузку запросов. Всегда анализируйте план выполнения запроса (EXPLAIN / EXPLAIN ANALYZE).