【问题标题】:Using Like and Concat in MySQL query在 MySQL 查询中使用 Like 和 Concat
【发布时间】:2011-09-01 05:53:26
【问题描述】:

我正在将文本文件加载到我的数据库中,并尝试在列出组织名称的表和保存文本文件以及与这些组织的潜在匹配项的表之间进行一些快速匹配。

我使用LOAD INFILE CONCURRENT 加载文件,对此没有任何问题。

扭曲来自这样一个事实,即我试图在原始文本表 (occupationoraffiliation) 中匹配的字段不仅仅是组织名称。所以我尝试使用带有通配符的LIKE 来匹配字符串。

为了匹配文本,我尝试使用这个查询:

UPDATE raw_faca JOIN orgs AS o
    ON raw_faca.org_id IS NULL AND raw_faca.occupationoraffiliation LIKE CONCAT('%',o.org_name,'%')
SET raw_faca.org_id = o.org_id;

我也试过没有CONCAT:

UPDATE raw_faca JOIN orgs AS o
    ON raw_faca.org_id IS NULL AND raw_faca.occupationoraffiliation LIKE ('%' + o.org_name + '%')
SET raw_faca.org_id = o.org_id;

raw_faca 表有 ~40,000 行,orgs 表有 ~20,000 行。我有所有的索引查询已经运行了几个小时左右——这对于操作来说似乎太长了。我试图进行的比较是效率低下还是我在这里做了一些非常愚蠢的事情?我希望避免逐行使用外部 php 或 python 脚本。

针对下面关于使用 Match . . . Against 的 cmets,我也尝试了以下查询:

UPDATE raw_faca JOIN orgs AS o ON raw_faca.org_id IS NULL AND MATCH(raw_faca.occupationoraffiliation) AGAINST (o.org_name IN NATURAL LANGUAGE MODE)
SET raw_faca.org_id = o.org_id; 

它给了我这个错误:

incorrect arguments to AGAINST

有什么想法吗?

【问题讨论】:

    标签: mysql concat sql-like


    【解决方案1】:

    带有前导通配符的LIKE 子句将无法利用任何索引。

    【讨论】:

    • 换句话说,@tchaymore,您的查询必须检查 40k * 20k = 800M 组合,这解释了为什么它这么慢。
    • 知道了——我一直在使用外部脚本,它们面临着基本相同的问题。关于如何在字段中进行匹配的任何想法,就像我在这里尝试做的那样,以一种可以利用索引的方式?
    • @tchaymore:如果这是一个 MyISAM 表,您可以考虑设置一个 full-text index。
    • 我在occupationoraffiliation 字段上有一个全文索引——也应该在两个org_id 字段上放一个吗?现在它们只是索引。
    • @tchaymore:那么您应该能够将您的LIKE 转换为类似于...AND MATCH(raw_faca.occupationoraffiliation) AGAINST (o.org_name IN NATURAL LANGUAGE MODE)... 的内容
    猜你喜欢
    • 2013-05-16
    • 1970-01-01
    • 2011-06-10
    • 1970-01-01
    • 2019-06-15
    • 1970-01-01
    • 2012-11-25
    • 1970-01-01
    • 2011-05-18
    相关资源
    最近更新 更多