陋室铭
永远也不要停下学习的脚步(大道至简至易)

posts - 2169,comments - 570,views - 413万

说法一:百分号%通配符前置会让SQL查询不走索引,改走全表扫描。这种说法很流行

结论是错误的

事实上这种说法不太准确 通配符%前置会让SQL查找索引时效率极速下降,但在大多数情况下还是会走索引(不需要全文索引,只要建一个普通的索引就可以了)

 

CREATE NONCLUSTERED INDEX [Ix_索引名] ON [dbo].[wkf_表名] 
(
 [db_title]  ASC
)

此时执行

SELECT top 10 [db_id],[db_Summary],[db_AddDate],[db_title]  FROM [库名].[dbo].[wkf_database]   where [db_title]like '%dba%'  order by 1 desc
 
查询计划显示得很清楚

加普通索引后

对比加索引之前:


说一个例外,复杂查询查询优化器可能会抛弃索引改走全表扫描。这不仅是LIKE '%关键词%' 时会这样,跟查询复杂度有关

 

 


说法二:百分号%通配符前置会让SQL查询走索引不如不走索引

这种说法非常片面,走索引比不走索引99%的情况下都会减少IO从而提高效率,但是:索引查找完的键匹配动作也是有一部分性能消耗的。像上面两张图所示,如果关键字很容易就匹配到了,全表扫描很快就找齐了数据,而索引扫描节省的时间不足以弥补键匹配动作所消耗时间的时候这种情况就发生了(大部分线上查询不存在这问题)这时候优化就变得诡异了。
处理方法:
1.不去管它,多出来的性能消耗不是很大。而且不同的关键词有不同的消耗,只是部分关键词存在此问题,可以忽略
2.更好的方法,如果条件允许建覆盖索引(又叫INCLUDE索引)。前题条件:a存储空间充足,b不显著影响DML操作,c覆盖的索引中没有大字段

CREATE NONCLUSTERED INDEX [Ix_索引名] ON [dbo].[wkf_表名] 
(
 [db_title]  ASC
)
INCLUDE ( [db_id],[db_Summary],[db_AddDate])

此时执行查询计划如下,清爽多了吧

 

以上就是我现在能想到的SQLSERVER处理SELECT *  FROM TABLENAME LIKE  '%关键词%'

 

总结:

 

1.使用模糊查询最好使用后置,前置会大大降低效率。

 

select * from T_OMS_EMPLOYEE_BASEINFOR where usernameCn like '%肖%'


2.使用全文检索,效率远远大于like

posted on   宏宇  阅读(1872)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 25岁的心里话
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
历史上的今天:
2017-07-22 BIOS设置fn
2017-07-22 云服务器ECS
2017-07-22 使用阿里云一年多个人经验之谈。(转)
2015-07-22 经销商、代理商、分销商的关系
2009-07-22 看完了黑客帝国
2008-07-22 VSS出项错误"Could not find the Visual SourceSafe Internet Web Service connection..."
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

点击右上角即可分享
微信分享提示