Я недавно создал инструмент создания схемы graphql, который проверяет представление JSON набора расширенных настраиваемых полей WordPress для сгенерировать схему graphql. Представление JSON основано на настраиваемых типах сообщений и расширенных настраиваемых полях, имеющихся в базе данных SQL.
Например, определение настраиваемого типа сообщения с именем Office Location
с настраиваемыми полями city
и street_address
приводит к схеме graphql, которую можно запросить следующим образом:
officeLocations {
post_title
locationInformation {
city
streetAddress
}
}
Это приводит к базовым SQL-запросам формы
SELECT
`meta_id`, `post_id`, `meta_key`, `meta_value`
FROM `wp_postmeta` AS `wp_postmeta`
WHERE `wp_postmeta`.`meta_key` = 'street_address'
AND `wp_postmeta`.`post_id` = 176
LIMIT 1;
а также
SELECT
`id`, `post_author`, `post_title`, `post_content`,
`post_excerpt`, `post_status`, `post_type`, `post_name`,
`post_date`, `post_parent`, `menu_order`, `guid`
FROM `wp_posts` AS `wp_posts`
WHERE (`wp_posts`.`id` = 176 OR `wp_posts`.`post_name` = NULL)
AND `wp_posts`.`post_status` = 'publish'
LIMIT 1;
которые извлекают расширенную настраиваемую информацию о публикациях из таблицы wp_postmeta
, сначала просматривая таблицу wp_posts
.
Использование этого инструмента генерации схемы на целевой странице скромного веб-сайта приводит к 4035 отдельным SQL-запросам к базе данных. Я не уверен, что это необычно, но это приводит к медленному времени выполнения (~ 4 с на моем MacBook Pro 2015 года).
Я хочу повысить эффективность этих запросов graphql для веб-сайта, данные которого редко меняются (по сути, статический веб-сайт). Исходя из исследований, мои четыре основных направления:
- Пакетные запросы с использованием загрузчика данных Facebook. Я почерпнул из этого источника и заглянул в возможности пакетной обработки загрузчика данных для SQL, что может быть сложно пакетировать запросы SQL, сгенерированные наивным резолверы graphql.
- Создавайте менее наивные преобразователи графов, используя что-то вроде join-monster
- Реализуйте кеширование ключей / значений с помощью Redis или Memcached, которое устанавливает уровень ответа кеш перед сервером GraphQL
- Скомпилируйте веб-сайт с динамическими запросами graphql в чисто статический веб-сайт, который затем развертывается как статический веб-сайт (удаляя graphql из уравнения)
Меня интересуют относительные достоинства этих проспектов так же, как и любых других.