【问题标题】:mysql join query slow in alfresco, using index thoughmysql join 查询在露天很慢,虽然使用索引
【发布时间】:2016-01-21 20:54:30
【问题描述】:

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

通过性能监视器,我可以看到很多请求(不知道是什么触发了这些请求)挂在 DB 上,响应时间接近 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 部分,我们该如何优化它。

非常感谢您的帮助。

【问题讨论】:

  • 一般不建议在 Alfresco 中将数千个文件放在一个文件夹中。如果您将文件分片到子目录中,每个分片文件夹中只有几百个,会发生什么情况?
  • 另外,现在有点晚了,但 PostGreSQL 通常比 MySQL 好很多!
  • 感谢您的意见。子目录是我们正在考虑的事情,但需要找到一种方法能够将这些文件移动到适当的文件夹中,而不会在生产中造成性能噩梦。我想知道 Aurora 会如何工作,尤其是看着 Alfresco perf。他们在 aws 论文中发布的基准。我想知道社区版本是否可以与 Aurora 一起使用。
  • 如果您从 4.0 升级到 5.0(甚至可能是 5.1 预览版),您将获得相当多的性能改进,而无需移动任何东西。自从 4.0 大约 4 年前问世以来,已经完成了很多工作!

标签: mysql solr alfresco


【解决方案1】:

不久前,我在 Solaris 上的 4.0.d 实例(使用 MySQL)上遇到了类似的性能问题,结果证明我使用的 MySQL 版本的默认引擎性能很差!

当我对 join / where 子句中引用的每一列进行索引后,问题就消失了,我获得了 98+ % 的性能提升!

【讨论】:

  • 你能分享你创建的索引吗?谢谢。
  • 我不记得列的列表,但它们都是外键,由于某种原因默认情况下它们没有被索引。
【解决方案2】:

我们发现了速度慢的两个原因

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

【讨论】:

    猜你喜欢
    • 2014-03-15
    • 1970-01-01
    • 2016-12-04
    • 1970-01-01
    • 2021-09-04
    • 1970-01-01
    • 2014-09-24
    • 1970-01-01
    相关资源
    最近更新 更多