MySQL: 搜索 TEXT 字段以查询开头的行
MySQL: searching rows with TEXT field beginning with a query
我有一个 table 并且其中一列是 TEXT 类型。我需要在 table 中搜索文本与给定字符串相似的行。
由于字符串可能很长(比如 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 末尾只放了一个百分号,表示我只想比较第一个字节。
希望MySQL脑洞尽量用key,不要多动
问题:
- 哪个查询更好有什么区别吗?我个人更喜欢第二种,因为它看起来更清晰,希望数据库引擎 (MyISAM) 能更好地理解它。
- 这是否正确 MySQL MyISAM 将为这些查询生成有效的代码?
- 如何在 PDO 的准备语句中放置“%”?
SELECT * FROM table
WHERE description LIKE ":text%"
?
是的,有区别。当 WHERE
条件对列值调用函数时,不能使用索引。我认为它不会意识到您的 SUBSTRING()
调用恰好与文本的索引部分匹配并使用它。另一方面,LIKE
被专门编码以识别它可以使用索引的情况。另外,如果你想比较两个字符串是否相等,你应该使用 =
,而不是 STRCMP()
,例如
WHERE SUBSTRING(`description`,1,20) = 'string_to_compare'
我相信它将对 LIKE
版本进行高效查询。
- 占位符不能用引号引起来。用
CONCAT()
组合起来:WHERE description LIKE CONCAT(:text, '%')
。或者您可以将 %
放在绑定到占位符的 PHP 变量的末尾,并使用 WHERE description LIKE :text
.
我有一个 table 并且其中一列是 TEXT 类型。我需要在 table 中搜索文本与给定字符串相似的行。
由于字符串可能很长(比如 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 末尾只放了一个百分号,表示我只想比较第一个字节。
希望MySQL脑洞尽量用key,不要多动
问题:
- 哪个查询更好有什么区别吗?我个人更喜欢第二种,因为它看起来更清晰,希望数据库引擎 (MyISAM) 能更好地理解它。
- 这是否正确 MySQL MyISAM 将为这些查询生成有效的代码?
- 如何在 PDO 的准备语句中放置“%”?
SELECT * FROM table WHERE description LIKE ":text%"
?
是的,有区别。当
WHERE
条件对列值调用函数时,不能使用索引。我认为它不会意识到您的SUBSTRING()
调用恰好与文本的索引部分匹配并使用它。另一方面,LIKE
被专门编码以识别它可以使用索引的情况。另外,如果你想比较两个字符串是否相等,你应该使用=
,而不是STRCMP()
,例如WHERE SUBSTRING(`description`,1,20) = 'string_to_compare'
我相信它将对
LIKE
版本进行高效查询。- 占位符不能用引号引起来。用
CONCAT()
组合起来:WHERE description LIKE CONCAT(:text, '%')
。或者您可以将%
放在绑定到占位符的 PHP 变量的末尾,并使用WHERE description LIKE :text
.