← Назад к вопросам

Что такое индексы?

2.0 Middle🔥 82 комментариев
#Теория тестирования

Комментарии (2)

🐱
deepseek-v3.2PrepBro AI7 апр. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Что такое индексы в контексте баз данных?

Индексы — это специальные структуры данных, которые создаются для ускорения операций поиска и извлечения данных из таблиц в базах данных. Основная аналогия — алфавитный указатель в конце книги, который позволяет быстро найти нужный термин, не перелистывая все страницы. Без индекса СУБД пришлось бы выполнять полное сканирование таблицы (FULL TABLE SCAN), что крайне неэффективно на больших объёмах данных.

Основные принципы работы индекса

  • Основа на ключевых столбцах: Индекс создаётся на один или несколько столбцов таблицы (например, customer_id, order_date).
  • Структура для быстрого поиска: Данные индекса организуются в оптимальных для поиска структурах, таких как B-деревья (B-Tree) (наиболее распространены), хеш-таблицы или битовые карты (Bitmap).
  • Отдельная структура данных: Индекс физически хранится отдельно от таблицы, но содержит ссылки (указатели) на фактические строки данных.
  • Компромисс «скорость чтения vs. скорость записи»: Главный принцип — индексы ускоряют операции SELECT (чтение), но замедляют INSERT, UPDATE и DELETE (запись), так как при каждом изменении данных должен быть обновлён и индекс.

Типы индексов (на примере SQL)

-- 1. Простой (одноколоночный) индекс (B-Tree по умолчанию)
CREATE INDEX idx_customer_name ON customers (last_name);

-- 2. Составной (композитный) индекс на несколько столбцов
-- Эффективен для запросов с условиями по этим столбцам
CREATE INDEX idx_orders_date_status ON orders (order_date, status);

-- 3. Уникальный индекс (гарантирует уникальность значений)
CREATE UNIQUE INDEX idx_product_sku ON products (sku_code);

-- 4. Индекс для полнотекстового поиска
CREATE FULLTEXT INDEX idx_article_content ON articles (content);

Как индексы используются на практике (с точки зрения QA Engineer)

  1. Анализ планов выполнения запросов (EXPLAIN): QA Engineer должен понимать, использует ли запрос индекс. Это критически важно для проверки производительности.

    EXPLAIN SELECT * FROM orders WHERE customer_id = 12345;
    -- В выводе ищем ключевые строки:
    -- type: ref (хорошо, используется индекс) vs. ALL (плохо, полное сканирование)
    -- key: idx_customer_id (имя используемого индекса)
    -- rows: 1 (сколько строк было просмотрено - чем меньше, тем лучше)
    
  2. Проектирование тестов производительности:

    *   **Нагрузочное тестирование:** Проверяем, как система ведёт себя под высокой параллельной нагрузкой на чтение с использованием индексов.
    *   **Тестирование деградации:** Моделируем сценарии, когда индексы становятся фрагментированными или устаревшими, и проверяем процедуры их обслуживания (REBUILD, REORGANIZE).
    *   **Сравнение «до» и «после»:** Замеряем время выполнения ключевых запросов до создания индекса и после.

  1. Понимание «подводных камней»:
    *   **Не все индексы полезны:** Избыточные индексы отнимают дисковое пространство и замедляют запись. Важно тестировать сценарии массовой вставки данных.
    *   **Индекс не используется:** Это может происходить, если в запросе используется функция (`WHERE UPPER(name) = '...'`), неравенство `<>`, или если селективность столбца очень низкая (например, индекс на столбец `gender` с значениями 'M'/'F').
    *   **Составные индексы и порядок столбцов:** Индекс `(A, B, C)` не поможет для поиска только по `B` и `C`. Это важный аспект для ревью тест-кейсов, проверяющих сложные запросы.

Пример сценария тестирования для QA

Цель: Проверить эффективность нового составного индекса idx_user_activity на таблице user_logs (поля: user_id, action, timestamp).

Действия QA:

  1. Проверка корректности создания: Убедиться, что индекс создан в БД после деплоя скрипта миграции.
  2. Функциональное тестирование: Выполнить запросы, которые должны использовать индекс:
    SELECT * FROM user_logs WHERE user_id = 100 AND action = 'login';
    SELECT user_id, COUNT(*) FROM user_logs WHERE timestamp > '2024-01-01' GROUP BY user_id;
    
  3. Проверка плана выполнения: Для каждого запроса выполнить EXPLAIN и подтвердить использование индекса idx_user_activity.
  4. Тестирование производительности:
    *   Замерить время выполнения запросов на таблице с ~1 млн записей.
    *   Сравнить с результатами до создания индекса (если есть baseline).
  1. Тестирование побочных эффектов:
    *   Замерить время выполнения массовой вставки 10к записей в `user_logs` и сравнить с baseline.
    *   Проверить, не увеличился ли значительно размер файла базы данных.

Вывод для QA: Понимание индексов позволяет инженеру по качеству выходить за рамки чисто функционального тестирования и активно участвовать в нефункциональном тестировании (производительность, надёжность), проектировать более умные тестовые данные и давать содержательную обратную связь разработчикам и DBA о потенциальных узких местах системы. Это ключевой навык для QA Automation Engineer, работающего с back-end или full-stack приложениями.