← Назад на главную

Оптимизация производительности Jira: кастомные поля и индексы

За последние годы я работал с несколькими Jira-инстансами, где количество кастомных полей перевалило за сотню. Типичная картина: система начинает тормозить, поиск работает медленно, а пользователи жалуются. В этой статье разберу, почему это происходит и как решить проблему без удаления функциональности.

Почему кастомные поля замедляют Jira

Начну с того, как Jira работает с кастомными полями внутри. Каждое кастомное поле создаёт дополнительные колонки в базе данных или записи в связанных таблицах. Когда Jira выполняет поиск или фильтрацию, она должна проверять все эти поля.

Проблема усугубляется, если поля не проиндексированы должным образом. Jira автоматически создаёт индексы только для стандартных полей и некоторых типов кастомных (например, Select List с ограниченным набором значений). Для текстовых полей, числовых полей и полей типа "User Picker" индексация может отсутствовать.

Реальный пример из практики

Недавно я столкнулся с инстансом, где было 147 кастомных полей, из них около 60 использовались в JQL-запросах. Время выполнения поиска доходило до 15 секунд. После аудита выяснилось, что только 12 полей имели индексы, и это были в основном Select List поля.

Как проверить, какие поля замедляют поиск

Первое, что нужно сделать — понять, какие именно поля создают проблему. В Jira есть встроенные инструменты для этого.

Метод 1: Анализ медленных запросов через лог

Включите логирование SQL-запросов в log4j.properties:

log4j.logger.com.atlassian.jira.action.admin.customfields=DEBUG
log4j.logger.com.atlassian.jira.issue.search=DEBUG
log4j.logger.hibernate.SQL=DEBUG

После этого выполните несколько медленных поисков и проанализируйте логи. Ищите запросы, которые выполняются дольше 500ms и содержат JOIN с таблицами кастомных полей.

Метод 2: Использование Jira Query Language для тестирования

Создайте несколько тестовых JQL-запросов с разными комбинациями полей и замерьте время выполнения. Например:

project = PROJ AND customfield_10001 ~ "value" AND customfield_10002 ~ "value2"

Если добавление каждого поля увеличивает время поиска больше чем на 100-200ms, это тревожный знак.

Оптимизация через индексацию полей

Самый эффективный способ ускорить поиск — создать индексы для полей, которые используются в JQL. Однако здесь есть нюансы.

Какие поля можно индексировать

  • Text Field — только для точного совпадения (точный поиск), не для частичного совпадения
  • Number Field — отлично индексируется, поддерживает диапазоны
  • Select List / Radio Buttons — автоматически индексируется
  • User Picker / Group Picker — можно индексировать, но нужно аккуратно
  • Date Picker / Date Time Picker — индексируется хорошо

Как создать индекс для кастомного поля

В Jira это делается через админ-панель, но процесс не всегда очевиден:

  1. Перейдите в Administration → Issues → Custom Fields
  2. Найдите нужное поле и выберите Edit
  3. В разделе Search Template проверьте, какой шаблон используется
  4. Если шаблон не поддерживает индексацию (например, "Text Search"), измените его на поддерживающий

Важно: изменение Search Template может повлиять на существующие JQL-запросы. Обязательно протестируйте критичные фильтры и дашборды после изменения.

Альтернативные подходы к оптимизации

Не всегда индексация решает проблему. Иногда нужно пересмотреть архитектуру использования полей.

Объединение связанных полей

Если у вас есть несколько полей, которые всегда используются вместе (например, "Регион", "Город", "Офис"), рассмотрите возможность их объединения в одно поле с иерархической структурой или использования поля типа "Cascading Select".

На одном проекте мы сократили количество полей с 23 до 8, объединив связанные справочники. Это не только ускорило поиск, но и упростило работу пользователей.

Использование лейблов вместо текстовых полей

Если поле используется только для категоризации и фильтрации, а не для хранения уникальных значений, используйте Labels вместо Text Field. Labels в Jira индексируются автоматически и работают значительно быстрее.

Перенос редко используемых полей

Если поле используется в поиске реже чем в 5% случаев, рассмотрите возможность хранения этих данных в Confluence или внешней системе с интеграцией через API. Это радикальный подход, но иногда оправданный.

Работа с индексами на уровне базы данных

Для серьёзной оптимизации может потребоваться работа напрямую с базой данных. Это продвинутый уровень, и делать это нужно очень осторожно.

Анализ планов выполнения запросов

Если у вас есть доступ к базе данных (что обычно есть в Data Center), можно анализировать планы выполнения запросов. Например, в PostgreSQL:

EXPLAIN ANALYZE 
SELECT * FROM jiraissue 
WHERE id IN (
    SELECT issue FROM customfieldvalue 
    WHERE customfield = 10001 AND stringvalue = 'target_value'
);

Это покажет, используются ли индексы и где происходят узкие места.

Создание составных индексов

В некоторых случаях стандартных индексов недостаточно. Если в поиске часто используются комбинации полей (например, project + status + customfield), может потребоваться составной индекс.

Внимание: создание индексов на уровне БД без понимания архитектуры Jira может привести к проблемам при обновлениях. Делайте это только если полностью понимаете последствия.

Типичные ошибки и подводные камни

За годы работы я накопил коллекцию ошибок, которые часто допускаются при оптимизации кастомных полей.

Ошибка 1: Индексация всех полей подряд

Больше индексов — не значит лучше. Каждый индекс замедляет операции INSERT и UPDATE. Индексируйте только те поля, которые реально используются в поиске.

Ошибка 2: Использование Text Field для категорий

Если поле имеет ограниченный набор значений (например, "Высокий", "Средний", "Низкий"), используйте Select List, а не Text Field. Select List индексируется автоматически и работает быстрее.

Ошибка 3: Игнорирование размера таблицы customfieldvalue

Таблица customfieldvalue может разрастаться до миллионов записей. Регулярно проверяйте её размер и очищайте данные удалённых полей или проектов.

Мониторинг производительности после оптимизации

После внесения изменений важно отслеживать результаты. Вот что я рекомендую мониторить:

  • Время выполнения типичных JQL-запросов — должно уменьшиться минимум на 30-50%
  • Размер таблицы customfieldvalue — не должен расти быстрее количества новых issues
  • Нагрузка на базу данных — количество медленных запросов должно снизиться
  • Отзывы пользователей — субъективная оценка скорости работы

Выводы и рекомендации

Оптимизация кастомных полей в Jira — это не одноразовое действие, а процесс. Начните с аудита: определите, какие поля используются в поиске и какие из них создают проблемы.

Создавайте индексы осознанно, только для полей, которые реально нужны в поиске. Рассматривайте альтернативные подходы: объединение полей, использование Labels, перенос данных во внешние системы.

И самое главное — не бойтесь экспериментировать на тестовой среде. Каждый инстанс Jira уникален, и то, что работает на одном, может не работать на другом. Тестируйте изменения и отслеживайте результаты.

Если у вас возникли вопросы или нужна помощь с оптимизацией вашего инстанса — свяжитесь со мной.