sql - 对于 char/varchar/text 列,为什么该列的索引可以加快搜索速度?

标签 sql mysql data-structures

如果是int,我知道会快一些,就是看不懂string类型。

注意事项: 大多数亚洲语言单词之间没有空格。而 mysql 不能将句子拆分成单词。另外,我指的是随机搜索,即单词可以出现在句子的任何位置。

最佳答案

一个要点是索引对某些类型的搜索根本没有帮助。例如:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE '%' + @SearchText + '%'

再多的普通索引也无助于该查询。它永远注定是缓慢的。 LIKE 表达式不是 sargable .

为什么?您首先需要了解索引的工作原理。他们基本上将被索引的列与主键(记录指针)一起放入一个新表中。然后他们根据索引列而不是键对该表进行排序。当您使用索引进行查找时,它可以非常快速地找到您想要的行,因为此索引已排序以促进使用二进制搜索等算法进行更高效的搜索。

现在再次查看该查询。通过在搜索文本前放置一个通配符,您只是告诉数据库您不确定您的列以什么开头。再多的分类也无济于事;您仍然需要遍历整个表以确保找到与表达式匹配的每条记录。这意味着该列上的任何普通索引对于此查询都是毫无值(value)的。

如果您想在文本列中搜索列中任意位置的搜索字符串,您需要使用一些不同的东西:全文索引。

现在对比一下这个查询:

SELECT * FROM [MyTable] WHERE [MyVarcharColumn] LIKE @SearchText + '%'

这对于普通索引来说工作得很好,因为你知道你希望列如何开始。它仍然可以与存储在索引中的排序值匹配,因此我们可以说它是可搜索的。

关于sql - 对于 char/varchar/text 列,为什么该列的索引可以加快搜索速度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1399533/

相关文章:

php - 用户 'root' @'localhost' 的访问被拒绝(使用密码 : YES) using MAMP server

当表中根本没有数据时,MySQL 解释在 "rows"中显示 1 行

php - 返回类别树的Mysql查询

php - 设置mysql表的容量使其可以容纳150行?

JavaScript 箭头函数用于计算调用时间,但不带任何参数

java - 使用 Java 的多个 SQL 查询(效率)

sql - 创建表但如果表已经存在则删除它

mysql - 如何查询 'other'双引号

java - 如何建立生产者-产品关系

c - 如何删除根节点作为完整树删除的一部分