使用LIKE%string%speed问题更新数据库查询

时间:2017-01-13 23:32:10

标签: mysql full-text-search

好的,所以我有两张桌子。一个表有超过200万行(描述),另一个表有35k行(名称)。我试图根据描述表中匹配的名称表名将id应用于描述表。例如......

描述

id | info_text | name_id
 1 | this is information for John Doe living in Oregon
 2 | going to Wisconsin with Jane Doe next wednesday

名称

id | name
 1 | John Doe
 2 | Jane Doe

因此,使用该表设置我使用此查询...

$qry = "UPDATE descriptions t1, names t2 SET t1.name_id = t2.id 
          WHERE t1.info_text LIKE Concat('%',t2.name,'%')";

这需要5分钟,服务器就会消失。我在info_text列中添加了一个全文索引,但我已经读过使用LIKE%'%仍然会进行全表扫描。是否有任何技巧或解决方案来加速这个过程,我不必逐个查看名称数据库中的所有名称来更新描述表中的200万行?任何帮助将不胜感激。感谢

1 个答案:

答案 0 :(得分:0)

无法优化LIKE '%string%',它必须执行完整扫描。您可以尝试的一件事是将表格分成子集。

$alphabet = array('a', 'b', ..., 'z');
foreach ($alphabet as $initial) {
    $qry = "UPDATE descriptions t1, names t2 SET t1.name_id = t2.id 
            WHERE t1.info_text LIKE '$initial%' AND t1.info_text LIKE Concat('%',t2.name,'%')";
    mysqli_query($conn, $qry);
}

确保info_text列上有普通索引。然后将第一个字符与LIKE匹配将很快,并且只需扫描子集中的名称。