我们经常在数据库中使用 LIKE 操作符来完成对数据的模糊搜索,LIKE 操作符用于在 WHERE 子句中搜索列中的指定模式。
如果需要查找客户表中所有姓氏是“张”的数据,可以使用下面的 SQL 语句:
SELECT * FROM Customer WHERE Name LIKE '张%'
如果需要查找客户表中所有手机尾号是“1234”的数据,可以使用下面的 SQL 语句:
SELECT * FROM Customer WHERE Phone LIKE '%123456'
如果需要查找客户表中所有名字中包含“秀”的数据,可以使用下面的 SQL 语句:
SELECT * FROM Customer WHERE Name LIKE '%秀%'
以上三种分别对应了:左前缀匹配、右后缀匹配和模糊查询,并且对应了不同的查询优化方式。
数据概览
现在有一张名为 tbl_like 的数据表,表中包含了四大名著中的全部语句,数据条数上千万:
左前缀匹配查询优化
如果要查询所有以“孙悟空”开头的句子,可以使用下面的 SQL 语句:
SELECT * FROM tbl_like WHERE txt LIKE '孙悟空%'
SQL Server 数据库比较强大,耗时八百多毫秒,并不算快:
我们可以在 txt 列上建立索引,用于优化该查询:
CREATE INDEX tbl_like_txt_idx ON [tbl_like] ( [txt] )
应用索引后,查询速度大大加快,仅需 5 毫秒:
由此可知:对于左前缀匹配,我们可以通过增加索引的方式来加快查询速度。
右后缀匹配查询优化
在右后缀匹配查询中,上述索引对右后缀匹配并不生效。使用以下 SQL 语句查询所有以“孙悟空”结尾的数据:
SELECT * FROM tbl_like WHERE txt LIKE '%孙悟空'
效率十分低下,耗时达到了 2.5秒:
我们可以采用“以空间换时间”的方式来解决右后缀匹配查询