首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Mysql在两个参数上使用左连接,在非常大的表上使用一个精确匹配和一个LIKE匹配-性能

问Mysql在两个参数上使用左连接,在非常大的表上使用一个精确匹配和一个LIKE匹配-性能
EN

Stack Overflow用户
提问于 2019-01-21 03:07:52
回答 1查看 24关注 0票数 0

我有两个历史数据表-一个(OldData)是来自数据源的40,000条记录,其中包含我正在尝试清理的部分/不准确数据,另一个(LookupData)是包含100多万条准确记录的明确来源。

我正在尝试用较大的表中的记录来丰富第一个较小的表,我可以通过连接surname和一个称为服务编号的数值来预测匹配的记录,但在第一个表中,这些数字通常是不完整的。

OldData (部分/不准确数据)示例:

代码语言:javascript
复制
Surname | ServiceNumber
Smith | 12345
Jones | 9876
Brown | 234

LookupData示例:

代码语言:javascript
复制
Surname | ServiceNumber
SMITH | 12345
SMITH | 23456
JONES | 98765 
JONES | 19182
BROWN | T12345 
BROWN | 56789

期望的结果:

代码语言:javascript
复制
OldData.Surname | OldData.ServiceNumber | LookupData.ServiceNumber
Smith | 12345 | 12345
Jones | 9876  | 98765
Brown | 234   | T12345

我当前的查询是

代码语言:javascript
复制
SELECT OldData.*,LookupData.ServiceNumber
FROM `OldData` 
LEFT JOIN `LookupData` 
ON lower(OldData.Surname) = lower(LookupData.Surname) 
AND LookupData.ServiceNumber like concat('%',OldData.ServiceNumber,'%') 

但这似乎永远不会完成

如果我将测试范围缩小到一个姓氏,并添加

代码语言:javascript
复制
WHERE OldData.Surname='Devlin'

我从OldData获得了47行,并得到了找到任何匹配项的准确LookupData.ServiceNumber (如果没有找到,则返回null ),但是这个查询平均仍然需要27秒。

我在Surname字段和ServiceNumber字段上都有索引。

如果我在寻找不可能的事情,我至少想知道:)谢谢

EN

回答 1

Stack Overflow用户

发布于 2019-01-21 05:48:49

让我们看一下查询的两个JOIN条件。

代码语言:javascript
复制
lower(OldData.Surname) = lower(LookupData.Surname) 

在等式的两端使用函数会减慢搜索速度。除非使用the BINARY operator,否则默认情况下,MySQL字符串搜索通常不区分大小写。此条件可以重写为

代码语言:javascript
复制
OldData.Surname = LookupData.Surname

第二个JOIN条件是:

代码语言:javascript
复制
LookupData.ServiceNumber like concat('%',OldData.ServiceNumber,'%') 

LIKE不利于性能,尤其是在开头有%时:因为MySQL索引通常是有序的,所以这会导致触发完整扫描,因为无法找到优化的搜索起点。在您的示例数据中,看起来您可以删除起始%。

使用INSTR可能不会提高性能。

您可以尝试使用regexp,例如:

代码语言:javascript
复制
LookupData.ServiceNumber REGEXP OldData.ServiceNumber

如果您确实需要在大数据上进行两端搜索,那么使用MySQL的方法是Full-Text Search Functions。这将需要在服务编号列上创建FULLTEXT索引(并可能将它们从数字转换为文本),然后:

代码语言:javascript
复制
MATCH LookupData.ServiceNumber AGAINST OldData.ServiceNumber
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54279959

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档