mysql 尽管使用索引,但在露天加入查询速度较慢

mysql join query slow in alfresco, using index though

我们在使用 Alfresco 4 时遇到了一些性能问题。0.e 和 mysql 5.5 后端。

通过性能监视器,我可以看到很多请求(不确定是什么触发了这些请求)挂在数据库上,响应时间接近 100-200 秒。在极端情况下是 3000 秒。

所有这些请求都来自本地的 alfresco 应用程序(不共享我们在单独服务器上的 gui)。客户端ip显示127.0.0.1。 URL = /alfresco/service/api/solr/metadata 在进一步深入研究时,似乎有 2 个查询,每个查询都需要超过 100 秒,如下所示 -

select
        assoc.id                    as id,
        parentNode.id               as parentNodeId,
        parentNode.version          as parentNodeVersion,
        parentStore.protocol        as parentNodeProtocol,
        parentStore.identifier      as parentNodeIdentifier,
        parentNode.uuid             as parentNodeUuid,
        childNode.id                as childNodeId,
        childNode.version           as childNodeVersion,
        childStore.protocol         as childNodeProtocol,
        childStore.identifier       as childNodeIdentifier,
        childNode.uuid              as childNodeUuid,
        assoc.type_qname_id         as type_qname_id,
        assoc.child_node_name_crc   as child_node_name_crc,
        assoc.child_node_name       as child_node_name,
        assoc.qname_ns_id           as qname_ns_id,
        assoc.qname_localname       as qname_localname,
        assoc.is_primary            as is_primary,
        assoc.assoc_index           as assoc_index
    from
        alf_child_assoc assoc
        join alf_node parentNode on (parentNode.id = assoc.parent_node_id)
        join alf_store parentStore on (parentStore.id = parentNode.store_id)
        join alf_node childNode on (childNode.id = assoc.child_node_id)
        join alf_store childStore on (childStore.id = childNode.store_id)

    where
        parentNode.id = ?

运行 对此查询的解释计划,其中的参数值似乎造成了最大的破坏(~3000 秒),这就是我所看到的-

    select_type table       type    possible_keys                       key               key_len   ref                       rows  Extra
    SIMPLE      parentNode  const   PRIMARY,store_id,fk_alf_node_store  PRIMARY           8         const                     1 
    SIMPLE      parentStore const   PRIMARY                             PRIMARY           8         const                     1 
    SIMPLE      childStore  index   PRIMARY                             protocol          454       NULL                      6     Using index
    SIMPLE      childNode   ref     PRIMARY,store_id,fk_alf_node_store  store_id          8         alfrescomgr.childStore.id 162579    
    SIMPLE      assoc       ref     parent_node_id,fk_alf_cass_pnode,   fk_alf_cass_cnode 8         alfrescomgr.childNode.id  1     Using where
                                    fk_alf_cass_cnode  

注意行数 = 162k。 对于几个这样的查询,父节点似乎指向一个存储数千个小型报价文档的文件夹。

我们的应用程序推送文档并通过一些元数据属性(如客户 ID)查询它们。我们使用 apache chemistry cmis api 进行交互。

  1. 您认为是什么触发了 solr 查询。它正在尝试加载所有子节点上的信息。
  2. 如果不能控制solr这块,怎么优化呢

非常感谢您的帮助。

不久前,我在 Solaris 上的 4.0.d 实例(带有 MySQL)上遇到了类似的性能问题,结果是 MySQL 版本的默认引擎我表现不好!

一旦我为 join / where 子句中引用的每一列编制索引,问题就消失了,我获得了 98% 以上的性能提升!

我们找出了运行缓慢背后的 2 个原因

  • mysql 数据库的数据卷上的磁盘 i/o 与其他系统相比要慢得多。我们使用 sysbench 随机 i/o 测试来验证这一点。
  • 上面提到的文件夹有几百万个文档,这似乎导致此查询变慢。
    • 我们也无法从共享加载文件夹内容页面以显示任何内容(导致超时相关错误)。
    • 我们计划重组此文件夹以包含更多子文件夹,以限制每个文件夹中的文档。有迹象表明这会有所帮助,但这样做听起来并不正确。对于将来可能出现的其他类似案例,我们可能真的没有这种控制权。
    • 我想知道这是否仍然是较新版本的 Alfresco 的限制 5.x