Разработчикам
Производительность
Руководство разработчика 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, дополнительные индексы по атрибутам или отдельная модель чтения для каталогов.