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 进行交互。
- 您认为是什么触发了 solr 查询。它正在尝试加载所有子节点上的信息。
- 如果不能控制solr这块,怎么优化呢
非常感谢您的帮助。
不久前,我在 Solaris 上的 4.0.d 实例(带有 MySQL)上遇到了类似的性能问题,结果是 MySQL 版本的默认引擎我表现不好!
一旦我为 join / where 子句中引用的每一列编制索引,问题就消失了,我获得了 98% 以上的性能提升!
我们找出了运行缓慢背后的 2 个原因
- mysql 数据库的数据卷上的磁盘 i/o 与其他系统相比要慢得多。我们使用 sysbench 随机 i/o 测试来验证这一点。
- 上面提到的文件夹有几百万个文档,这似乎导致此查询变慢。
- 我们也无法从共享加载文件夹内容页面以显示任何内容(导致超时相关错误)。
- 我们计划重组此文件夹以包含更多子文件夹,以限制每个文件夹中的文档。有迹象表明这会有所帮助,但这样做听起来并不正确。对于将来可能出现的其他类似案例,我们可能真的没有这种控制权。
- 我想知道这是否仍然是较新版本的 Alfresco 的限制 5.x
我们在使用 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 进行交互。
- 您认为是什么触发了 solr 查询。它正在尝试加载所有子节点上的信息。
- 如果不能控制solr这块,怎么优化呢
非常感谢您的帮助。
不久前,我在 Solaris 上的 4.0.d 实例(带有 MySQL)上遇到了类似的性能问题,结果是 MySQL 版本的默认引擎我表现不好!
一旦我为 join / where 子句中引用的每一列编制索引,问题就消失了,我获得了 98% 以上的性能提升!
我们找出了运行缓慢背后的 2 个原因
- mysql 数据库的数据卷上的磁盘 i/o 与其他系统相比要慢得多。我们使用 sysbench 随机 i/o 测试来验证这一点。
- 上面提到的文件夹有几百万个文档,这似乎导致此查询变慢。
- 我们也无法从共享加载文件夹内容页面以显示任何内容(导致超时相关错误)。
- 我们计划重组此文件夹以包含更多子文件夹,以限制每个文件夹中的文档。有迹象表明这会有所帮助,但这样做听起来并不正确。对于将来可能出现的其他类似案例,我们可能真的没有这种控制权。
- 我想知道这是否仍然是较新版本的 Alfresco 的限制 5.x