0

我有一个缓慢的 MySQL SELECT 查询,我似乎无法排除故障。

这是一个简单的,在一个大约有 600,000 条记录的表上。

SELECT * 
FROM  `civicrm_contact` contact
WHERE contact.external_identifier =123456

Select 查询需要 3-6 秒之间的任何时间,这使得导入另外 600,000 条依赖于此查询的记录完全不切实际。

表索引显示在附图中:表索引

如果我根据 contact.id=123456 进行搜索,那么查询时间会下降到大约 0.004 秒。contact.id 是表的主键。external_identifier 是唯一索引。

4

4 回答 4

1

我知道这是一个旧线程,但由于它与 CiviCRM 相关,我想我会提出我的想法。该修复实际上不是最佳实践,因为您更改了其中一个核心打包表以使您的查询运行得更快。虽然这对你来说可能没问题,但我绝对不会向所有人推荐这个。

您的解决方案可能已经突出了查询的问题,您似乎在告诉查询您期望一个数字,但实际上数据存储为 VARCHAR。所以我认为简单地在值周围加上单引号就可以了?

SELECT * FROM civicrm_contactcontact WHERE contact.external_identifier = '123456'

如果没有这个,我很确定(与 Oracle 合作多年)会发生隐式数据类型转换,因此查询将无法使用 INDEX。

一个解释计划应该证明这个理论。

谢谢

帕尔韦斯

于 2013-04-14T11:24:17.313 回答
0

看来您使用BTREE索引。如果您不对该列执行任何范围查询(使用<、或) >,您可能需要使用基于哈希的索引。<=>=

有关详细信息,请参阅B 树和哈希索引的比较

在这里查看确切的语法。

于 2012-04-23T16:45:20.717 回答
0

我怀疑数据类型转换是否存在问题。我想知道这是否与索引字段的大小限制有关。作为 btree 意味着索引键可能比散列键大得多。这是必要的吗?将外部 id 存储在单独的表中并根据数字 id 链接它们会更好吗?

这里的问题多于答案。

于 2013-06-04T14:47:58.520 回答
0

我更改了结构以制作 INT 类型的 external_identifier 而不是 VARCHAR。速度提高到 0.006s

我还不确定这是否会产生更广泛的影响

于 2012-04-24T18:07:09.053 回答