在 MySQL 中加快跨多个字段的 LIKE %foo% 搜索的方法
Ways to speed up a LIKE %foo% search across multiple fields in MySQL
我正在寻找一种在 MySQL 数据库中跨两个 table 进行尽可能快的不完整单词 LIKE "%foo%"
查找的方法。
假设我有两个 table,盒子和对象,其中每个盒子包含多个对象。我们要做的是通过将搜索字符串与 Box.name
或 Object.name
.
相匹配来找到盒子的 ID (Box.id)
为了让您了解我们正在处理的规模,Boxes 包含约 500,000 个条目,而 Objects 包含约 200,000 个条目。
每个对象都在一个盒子里,并不是每个盒子都包含对象。我在 Box.id
、Object.id
和 Object.box_id
.
上有索引
为什么?
我需要快速(200 毫秒)的数据,以便在用户键入搜索时提供建议。数据集基本上是静态的,每年都会更新一次。 Box.id
永远不会改变。我正在使用初始通配符,因为匹配词可能不会从字符串的开头开始 - 例如,"flo"
需要建议 "cake flour"
以及 "flour"
.
我试过的:
在两个 table 之间进行 LEFT JOIN:
SELECT b.id, b.name, o.name FROM boxes b LEFT JOIN objects o ON (b.id = o.box_id) WHERE ((b.name LIKE "%test str%") OR (o.name LIKE "%test str%")) LIMIT 10;
搜索时间:3900ms.
将所有内容反规范化为一次查找table:
SELECT n.id, n.box_name, n.object_name from lookup_table n WHERE ((n.box_name LIKE "%test str%") OR (n.object_name LIKE "%test str%")) LIMIT 10;
搜索时间:1100ms
。
摆脱 JOIN 显然会产生奇迹;然而,这还是太慢了。理想情况下,这应该花费 200 毫秒或更短时间。有没有人知道如何优化部分词匹配查询?
研究全文索引。您不应该使用通配符作为生产系统中的第一个字符进行查询。
不要非规范化,因为这样做会带来其他问题,尤其是数据完整性问题,其他由表太宽引起的性能问题,一对一关系变成一对多时的问题,其他受影响的代码那会打破,等等。加入是好的。你应该想要连接,像连接这样的数据库。当然,您应该确保您加入的字段已编入索引。
如果这是 UI 中的 JS 应用程序,请查找可执行您所需操作的程序包。它们经过调整以获得良好的速度,并且不依赖于 SQL。
我正在寻找一种在 MySQL 数据库中跨两个 table 进行尽可能快的不完整单词 LIKE "%foo%"
查找的方法。
假设我有两个 table,盒子和对象,其中每个盒子包含多个对象。我们要做的是通过将搜索字符串与 Box.name
或 Object.name
.
为了让您了解我们正在处理的规模,Boxes 包含约 500,000 个条目,而 Objects 包含约 200,000 个条目。
每个对象都在一个盒子里,并不是每个盒子都包含对象。我在 Box.id
、Object.id
和 Object.box_id
.
为什么?
我需要快速(200 毫秒)的数据,以便在用户键入搜索时提供建议。数据集基本上是静态的,每年都会更新一次。 Box.id
永远不会改变。我正在使用初始通配符,因为匹配词可能不会从字符串的开头开始 - 例如,"flo"
需要建议 "cake flour"
以及 "flour"
.
我试过的:
在两个 table 之间进行 LEFT JOIN:
SELECT b.id, b.name, o.name FROM boxes b LEFT JOIN objects o ON (b.id = o.box_id) WHERE ((b.name LIKE "%test str%") OR (o.name LIKE "%test str%")) LIMIT 10;
搜索时间:3900ms.
将所有内容反规范化为一次查找table:
SELECT n.id, n.box_name, n.object_name from lookup_table n WHERE ((n.box_name LIKE "%test str%") OR (n.object_name LIKE "%test str%")) LIMIT 10;
搜索时间:1100ms
。
摆脱 JOIN 显然会产生奇迹;然而,这还是太慢了。理想情况下,这应该花费 200 毫秒或更短时间。有没有人知道如何优化部分词匹配查询?
研究全文索引。您不应该使用通配符作为生产系统中的第一个字符进行查询。
不要非规范化,因为这样做会带来其他问题,尤其是数据完整性问题,其他由表太宽引起的性能问题,一对一关系变成一对多时的问题,其他受影响的代码那会打破,等等。加入是好的。你应该想要连接,像连接这样的数据库。当然,您应该确保您加入的字段已编入索引。
如果这是 UI 中的 JS 应用程序,请查找可执行您所需操作的程序包。它们经过调整以获得良好的速度,并且不依赖于 SQL。