zoukankan      html  css  js  c++  java
  • 淡sqlserver对like '%关键词%' 处理时的索引利用问题

    说法一:百分号%通配符前置会让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

  • 相关阅读:
    RABC权限管理
    七牛云上传
    支付宝沙箱支付(Django端)超适合小白哦~
    ModelSerialzier + ModelViewSet基础使用
    微博三方登录
    Celery梳理
    ios 动画
    ios 贝塞尔动画
    ios 贝塞尔
    ios Masonry 开发细节
  • 原文地址:https://www.cnblogs.com/cuihongyu3503319/p/11227434.html
Copyright © 2011-2022 走看看