文章表有个保存标签的字段logtag,内容格式是这样的:tag1,tag2,tag3
目前用like来查询效率很低:logtag like '%tag1%' 
怎么样写sql效率高?

解决方案 »

  1.   

    不如间个索引
    create index IX_log on tb(logtag)
      

  2.   

    试试select * from tb where (',tag1,',','+logtag+',')>0
      

  3.   

    加了索引like '%tag1%'这样也作用不大的,如果是like 'tag1%'这样才有用.
      

  4.   

    select * from tb where charindex(',tag1',logtag)>0
      

  5.   


    如果有索引的话 把logtag like '%tag1%' 改成logtag like 'tag1%' 
    如果没有索引就凑合用这个charindex(',tag1',logtag)>0
      

  6.   

    是不是少了charindex函数名,哈哈
    select * from tb where charindex('tag1',logtag)>0
      

  7.   

    logtag like '%tag1%' --如果你用这个,不如用charindex来判断 
      

  8.   

    多谢这位兄弟提醒,偶大意了,改正如下:
    select * from tb where charindex(',tag1,',','+logtag+',')>0
      

  9.   

    charindex比like '%tag1%' 要好。
      

  10.   

    一般情况下:like %af%是表扫用不了索引,字段长度直接影响耗时呀
    like 'asdfafd%' 索引扫描
    条件中对列使用函数也可能用不到索引 
    用全文的话要空间
      

  11.   

    locate(',tag1,',','+logtag+',')>0我这样用了,好象要好一点,mysql的locate等同于mssql的charindex,
      

  12.   

    应该再建一个表
    字段为:tag名(或id),文章id
      

  13.   

    这样不是很麻烦?
    1.添加文章要搜索整个tag表然后添加进新文章的id,
    2.特别是修改文章的tag,要添加修改后的文章id到tag表里面,同时要删除原tag表里的文章id,
    3.删除文章又要删除tag里所有该文章的id,
    4.一个tag可能有几百篇文章用,那就要保存几百篇文章的id,文章id已经到5位数了,那这个tag表会不会很大?
      

  14.   

    格式是这样的tag1,tag2,tag3 
    用logtag like 'tag1%' 是精确匹配前面的,那后面的tag2,tag3不是查询不到了?
      

  15.   


    建议用这样吧
    select * from tb where charindex(',tag1,',','+logtag+',')>0
      

  16.   

    1、为什么要搜索tag表?直接添加文字id-tag1、文字id-tag2、。不就行了
    2、3、要删除原tag表里的文章id对应的所有记录,很简单
    4、这种简单的表,索引很容易实现,记录数大不会有什么问题(查询慢不了,插入时略慢)
      

  17.   

    为什么charindex 比 like 高效?