好的,所以我有两张桌子。一个表有超过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万行?任何帮助将不胜感激。感谢
答案 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
匹配将很快,并且只需扫描子集中的名称。