PageCharm

Разработчикам

Производительность

Руководство разработчика PageCharm

Как проверять PageCharm на большом каталоге: 100 000+ товаров, фильтры, сортировка, пейджинг и сравнение SQLite/MySQL/PostgreSQL.

Историческая документация исследовательского стенда. Сам стенд и его данные не входят в очищенный репозиторий 1.0.0; приведённые замеры не являются результатом испытания выпуска 1.0.0.

Perf-сайт

В solution добавлен проект samples/PageCharm.PerformanceWeb. Он создает большой блок perf-catalog с шаблоном товара и генерирует 100 000+ записей контента с атрибутами: SKU, категория, бренд, цена, остаток, рейтинг, флаг, описание, дата публикации и теги.

Что измеряем

Публичная страница /catalog и JSON endpoints проверяют фильтры, поиск, сортировку, пейджинг, exact-фильтры по словарным alias и выборки по тегам. /api/catalog использует IPageCharmContentQuery, а /api/catalog/raw использует более узкую EF Core-проекцию. Это помогает увидеть цену текущего публичного query API и понять, где нужна оптимизация.

Базы данных

SQLite запускается без внешней инфраструктуры. Для PostgreSQL и MySQL в perf-проекте есть docker-compose.yml с отдельными портами. Один и тот же benchmark-скрипт можно запускать против всех трех провайдеров.

Текущие выводы

Индексы типизированных атрибутов и точные строковые индексы заметно ускоряют WhereFieldEquals, range-фильтры и часть комбинированных сортировок. Дополнительно Search и SearchFields используют поисковую read-модель: PostgreSQL идет через GIN to_tsvector, MySQL через FULLTEXT, SQLite пока остается на LIKE.

На 100 000 товаров PostgreSQL ускорил текстовый поиск примерно с 1332 мс до 59 мс. SQLite сохранил текстовый поиск около 147 мс, но ускорил точную фильтрацию категории и бренда со 150 мс до 37 мс. MySQL убрал регрессию текстового поиска после прошлых индексов: с 1121 мс до 505 мс, но следующий шаг для него — не выполнять full-text подзапрос дважды для CountAsync() и страницы результатов.

Подробная таблица результатов и рекомендации по выбору провайдера вынесены в раздел «Производительность и выбор БД».

Пример

PAGECHARM_PERF_PROVIDER=sqlite \
PAGECHARM_PERF_SEED_ON_STARTUP=true \
PAGECHARM_PERF_SEED_COUNT=100000 \
ASPNETCORE_ENVIRONMENT=Development \
dotnet run --project samples/PageCharm.PerformanceWeb/PageCharm.PerformanceWeb.csproj \
  --urls http://127.0.0.1:5105

samples/PageCharm.PerformanceWeb/benchmark-catalog.sh http://127.0.0.1:5105 30

Следующий шаг

После первых замеров будем решать, нужен ли легкий projection-режим в IPageCharmContentQuery, дополнительные индексы по атрибутам или отдельная модель чтения для каталогов.