MySQL:使用以查询开头的TEXT字段搜索行

时间:2016-12-29 17:27:38

标签: mysql blob myisam

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

由于字符串可能很长(假设说10000字节),我认为只比较字符串的前20个字节就足够了。为了更快地搜索,我创建了一个密钥:

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 的末尾只放了一个百分号,以便向DB说我只想比较第一个字节。

我希望MySQL大脑能够尽力使用密钥,而不是做任何额外的动作。

问题:

  1. 哪个查询更好有什么区别?我个人更喜欢第二种,因为它看起来更清晰,希望数据库引擎(MyISAM)可以更好地理解。
  2. 这是否正确MySQL MyISAM将为这些查询提供有效的代码?
  3. 如何在PDO的准备声明中加入'%'? SELECT * FROM table WHERE description LIKE ":text%"

1 个答案:

答案 0 :(得分:1)

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

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

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