mysql - 提高 SQL LIKE 查询性能

标签 mysql sql performance sql-like

我们有一个包含产品信息的大表。几乎所有时候我们都需要查找包含特定单词的产品名称,但不幸的是,这些查询需要永远运行。

示例:查找名称中包含单词“steel”和“102”的所有产品(不一定彼此相邻,因此像“Ninja steel iron 102 x”这样的产品是匹配的,就像“Dragon steel 102 b"是它)。

目前我们是这样做的:

SELECT columns FROM products WHERE name LIKE '%WORD1%' AND name LIKE '%WORD2%'(相似词的数量通常是 2-4,但理论上可以是 7- 8 个或更多)。

有没有更快的方法?

我们只是匹配单词,所以我想知道这是否能以某种方式提供帮助(即上面示例中的产品是匹配项,但“Samurai swordsteel 102 v”不是匹配项,因为“钢”不是单独存在的)。

我自己的想法是用 productnames 中的单词制作一个辅助表,然后使用该表获取匹配产品的 ID。

即一个像这样的表:[id, word, productid] 所以我们得到例如:

1, samurai, 3
2, swordsteel, 3
3, 102, 3
4, v, 3

只是想知道在 MySQL 中是否有内置的方法来执行此操作,因此我不必实现自己的东西 + 维护两个表。

谢谢!

最佳答案

不幸的是,模式名称的开头有通配符。因此,MySQL 不能为此使用标准索引。

您有两个选择。首先,如果这些词确实是关键字/属性,那么您应该有另一个表,每个词一行。

如果不是这样,您可以尝试全文索引。请注意,MySQL 具有最小单词长度的属性,并使用停用词列表。在构建索引之前,您应该考虑这些因素。

关于mysql - 提高 SQL LIKE 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37369639/

相关文章:

sql - 最简单的标准 C 语言 SQL 实现,可用于基于 Linux 的 ARM 终端

c# - 访问只读静态变量比重复从 Azure blob 检索数据更好还是更差?

JQuery Datatable - 将单个单元格拆分为多个列以提高可读性?

php - 如何在 PHP 脚本中循环访问多个 MySQL 数据库

mysql - 在数据库中分离新用户和返回用户

sql - RJDBC 日期混淆

performance - 如何 : the minimal server to serve zero length answers

javascript - JavaScript 包装器对象创建是轻量级的吗?

php - 当在行中勾选复选框时,如何使用 php 表单将多行插入到 mysql

mysql - 存储过程和查询执行结果不同