Mysql 如何提高静态网站WordPress GraphQL服务器的效率

Mysql 如何提高静态网站WordPress GraphQL服务器的效率,mysql,sql,performance,graphql,gatsby,Mysql,Sql,Performance,Graphql,Gatsby,我是一个graphql模式生成工具,它检查一组WordPress高级自定义字段的JSON表示以生成graphql模式。JSON表示基于SQL数据库中的自定义post类型和高级自定义字段 例如,使用自定义字段city和street\u address定义一个名为Office Location的自定义帖子类型,将生成一个graphql架构,可通过以下方式查询: officeLocations { post_title locationInformation { cit

我是一个graphql模式生成工具,它检查一组WordPress高级自定义字段的JSON表示以生成graphql模式。JSON表示基于SQL数据库中的自定义post类型和高级自定义字段

例如,使用自定义字段
city
street\u address
定义一个名为
Office Location
的自定义帖子类型,将生成一个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;

通过首先遍历
wp_posts
表,从
wp_postta
表中提取高级自定义post信息

在一个普通网站的登录页上使用这个模式生成工具会导致对数据库进行4035个单独的SQL查询。我不确定这是否是不寻常的,但它会导致执行时间变慢(在2015年的MacBook Pro上约4秒)

对于一个数据很少变化的网站(本质上是一个静态网站),我希望提高这些graphql查询的效率。根据研究,我的四个主要途径是

  • 使用批处理查询。我从中了解到,要批处理由朴素的graphql解析器生成的SQL查询可能很困难
  • 使用以下内容创建不太简单的graphql解析器
  • 使用Redis或Memcached实现键/值缓存
  • 将带有动态graphql请求的网站编译为纯静态网站,然后将其部署为静态网站(从等式中删除graphql)

  • 我对这些途径以及其他途径的相对优点很感兴趣。

    在开始使用缓存和其他能源密集型“解决方案”之前,让我们做一些事情来加快查询本身的速度

    查询1(到达后问题)

    标准的
    wp_postemta
    模式效率低下。这样更好:

    CREATE TABLE wp_postmeta (
        post_id BIGINT UNSIGNED NOT NULL,
        meta_key VARCHAR(255) NOT NULL,
        meta_value LONGTEXT NOT NULL,
        PRIMARY KEY(post_id, meta_key),
        INDEX(meta_key)
        ) ENGINE=InnoDB;
    
    有关说明,请参阅,如果遇到767个问题,该怎么办,以及如何处理对
    meta_id
    的需求(这基本上是无用的)

    这些提示将加快大多数涉及
    wp\u postmeta
    的查询

    查询2(错误公式)

    • wp\u posts.post\u name=NULL
      总是失败;改为说
      wp\u posts.post\u name为NULL
    • 如果没有按订购,
      限制
      将提供任意行
    • 没有很好地优化
    改写如下:

    SELECT * FROM 
        ( ( SELECT ...
                FROM `wp_posts` AS `wp_posts`
                WHERE `wp_posts`.`id` = 176
                  AND `wp_posts`.`post_status` = 'publish'
                LIMIT 1 )
          UNION DISTINCT
          ( SELECT ...
                FROM `wp_posts` AS `wp_posts`
                WHERE `wp_posts`.`post_name` IS NULL
                  AND `wp_posts`.`post_status` = 'publish'
                LIMIT 1 )
        ) LIMIT 1
    
    然后这些将是有益的:

    INDEX(post_status, post_id)
    INDEX(post_status, post_name)
    
    如果按添加
    订单,则需要在3个位置添加;就在每个
    限制之前


    之前:对
    wp\u posts
    进行全表扫描。根据我的建议:两个非常高效的单行抓取,再加上计算两行中的哪一行可以提供数据。

    在开始缓存和其他高能耗的“解决方案”之前,让我们做一些事情来加快查询本身的速度

    查询1(到达后问题)

    标准的
    wp_postemta
    模式效率低下。这样更好:

    CREATE TABLE wp_postmeta (
        post_id BIGINT UNSIGNED NOT NULL,
        meta_key VARCHAR(255) NOT NULL,
        meta_value LONGTEXT NOT NULL,
        PRIMARY KEY(post_id, meta_key),
        INDEX(meta_key)
        ) ENGINE=InnoDB;
    
    有关说明,请参阅,如果遇到767个问题,该怎么办,以及如何处理对
    meta_id
    的需求(这基本上是无用的)

    这些提示将加快大多数涉及
    wp\u postmeta
    的查询

    查询2(错误公式)

    • wp\u posts.post\u name=NULL
      总是失败;改为说
      wp\u posts.post\u name为NULL
    • 如果没有按
    订购,
    限制
    将提供任意行
  • 没有很好地优化
  • 改写如下:

    SELECT * FROM 
        ( ( SELECT ...
                FROM `wp_posts` AS `wp_posts`
                WHERE `wp_posts`.`id` = 176
                  AND `wp_posts`.`post_status` = 'publish'
                LIMIT 1 )
          UNION DISTINCT
          ( SELECT ...
                FROM `wp_posts` AS `wp_posts`
                WHERE `wp_posts`.`post_name` IS NULL
                  AND `wp_posts`.`post_status` = 'publish'
                LIMIT 1 )
        ) LIMIT 1
    
    然后这些将是有益的:

    INDEX(post_status, post_id)
    INDEX(post_status, post_name)
    
    如果按添加
    订单,则需要在3个位置添加;就在每个
    限制之前


    之前:对
    wp\u posts
    进行全表扫描。根据我的建议:两个非常有效的单行抓取,再加上计算两行中的哪一行可以传递信息。

    我的意思是,您在这里遇到了很多事情,我不知道问题的确切含义。使用dataloader之类的技术应该会对发送的查询量产生对数效应。您面临的问题似乎源于这样一个事实,“自动生成”和“性能”是两件需要付出巨大努力才能结合起来的事情。事实上,有多家公司试图解决这个问题,比如Prisma或。我想我没有一个明确的问题,但是我对不同解决方案的相对优点感兴趣。看起来dataloader是一个比简单地在查询级别缓存结果“更难”的问题,但是不会遭受缓存使用量激增的风险。我认为对于我的特定用例,由于数据基本上是静态的,并且查询是不变的,所以我将在查询级别进行缓存。我将在实现后报告我的结果。为什么不使用“wp-graphql”插件呢?Apollo客户端在(规范化的)查询缓存、批处理等方面可能会更好。我的意思是,您在这里遇到了很多事情,但我不知道到底是什么问题。使用dataloader之类的技术应该会对发送的查询量产生对数效应。您面临的问题似乎源于这样一个事实,“自动生成”和“性能”是两件需要付出巨大努力才能结合起来的事情。事实上,有多家公司试图解决这个问题,比如Prisma或。我想我没有一个明确的问题,但是我对不同解决方案的相对优点感兴趣。看起来dataloader是一个比简单地在查询级别缓存结果“更难”的问题,但是不会遭受缓存使用量激增的风险。我认为对于我的特定用例,由于数据基本上是静态的,并且查询是不变的,所以我会非常高兴