MySQL:搜索包含以查询开头的 TEXT 字段的行

标签 mysql blob myisam

我有一个表,其中一列是 TEXT 类型。我需要在表中搜索文本与给定字符串类似的行。

由于字符串可能很长(假设有 10000 字节),我决定仅比较字符串的前 20 个字节就足够了。为了更快地进行此搜索,我创建了一个 key :

KEY `description` (`description`(20))

所以我现在想做的是以下查询之一:

SELECT * FROM `table` WHERE STRCMP(SUBSTRING(`description`,0,20),'string_to_compare') = 0

SELECT * FROM `table` WHERE `description` LIKE 'string_to_compare%')

请注意,我在 string_to_compare 末尾仅放置了一个百分号,用于向数据库表明我只想比较第一个字节。

希望MySQL的大脑能尽量用key,不要做任何多余的 Action 。

问题:

  1. 哪个查询更好有什么区别吗?我个人更喜欢第二种,因为它看起来更清晰,并且希望数据库引擎(MyISAM)能够更好地理解。
  2. MySQL MyISAM 将为这些查询生成有效的代码吗?
  3. 如何在 PDO 的准备语句中添加“%”? 从表中选择 * 哪里有像“:text%”这样的描述

最佳答案

  1. 是的,有区别。当 WHERE 条件对列值调用函数时,无法使用索引。我认为它不会意识到您的 SUBSTRING() 调用恰好与文本的索引部分匹配并使用它。另一方面,LIKE 经过专门编码以识别可以使用索引的情况。另外,如果您想比较两个字符串是否相等,您应该使用 =,而不是 STRCMP(),例如

    WHERE SUBSTRING(`description`,1,20) = 'string_to_compare'
    
  2. 我相信它会对 LIKE 版本进行有效的查询。

  3. 占位符不能用引号引起来才能发挥作用。使用 CONCAT() 将其组合:WHERE description LIKE CONCAT(:text, '%')。或者,您可以将 % 放在绑定(bind)到占位符的 PHP 变量的末尾,并使用 WHERE description LIKE :text

关于MySQL:搜索包含以查询开头的 TEXT 字段的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41384470/

相关文章:

mysql - MySQL 复合主键作为外键

mysql查询和索引怎么做

python - django makemigrations 中的操作错误 1050 错误 “Table already exists”

c# - 使用 MySql 在 Entity Framework 6 中延迟加载数据不起作用

mysql - 如何解码并查看Jboss JMS消息内容?

mysql - MySQL 中的大型唯一键

mysql - MyISAM vs. InnoDB vs. 其他...?

entity-framework - MVC 使用 EF 存储 SQL Server 中的任何文件 [BLOB]

javascript - JavaScript 最大 Blob 大小是否有任何限制

Wordpress InnoDB 和 MyISAM 表