我正在尝试在几百万行的表格中搜索城市名称。
我并不是真的想要进行全文搜索,而是接近一些。例如,搜索“洛杉矶”不仅应该返回“洛杉矶”,还应该返回“东洛杉矶” - 而不是“东洛杉矶”(白色空间!)。
不幸的是,这需要一个像这样的查询:
SELECT
cities.name
FROM
cities
WHERE
(cities.name LIKE '% los angel%' OR cities.name LIKE 'los angel%') AND cities.country = 'US'
LIMIT 40
这会返回我预期的结果 - 但大约需要6秒,这很糟糕。删除LIKE'%los angel%'子句会将查询提高到0.05秒左右,但不会给我我想要的完整结果。
索引方面,列cities.name(varchar 200)上有一个B-TREE索引。不能做全文索引,因为它是一个innodb表。
任何聪明的方法我可以在不转换为myisam的情况下对其进行优化?
我对编写性能并不在乎,因为它主要是一个只读表。
答案 0 :(得分:0)
没有MySQL索引方法会让你“东洛杉矶”而不是“EastLos Angeles”,加上许多未说明的案例:“代顿”但不是“代托纳海滩”,“森林山”而不是“森林山”,“波特兰,我“但不是”波特兰,或“。等
但是,您可以使用SQL和应用程序代码的组合。使用FULLTEXT
索引搜索“Angeles”将非常快,然后应用程序代码可以处理它周围的内容。请注意,“Hill”可能与FULLTEXT
中的“Hills”匹配,因此这将是另一件需要检查的事情。此外,还有一个最小的“字长”;如果你不改变它,“Santa Fe Springs”中的“Fe”将被忽略。短名称(犹他州的“罗伊”)可能是一个问题。挪威有一个单字母的城市:“Å”。