select * from table_a where title like '%文字%'
上面这条语句like不会使用我创建的title索引,如果用'文字%'虽然会用到索引,可是又不符合查询结果,关于这个问题我查了很多资料还是没找到解决方法,有谁能解决这个问题吗

解决方案 »

  1.   

    用B树索引的数据库都不能解决这个问题试一试select * from (select * from table_a where title like '文字%') where title like '%文字%'
    不知道MYSQL的那个版本支持这个语法
      

  2.   

    楼上的即使语法可以执行,但select * from table_a where title like '文字%'这样的查询结果也不是符合我的需要啊,还有人能解决这个问题吗?
      

  3.   

    select * from (select * from table_a where title like '文字%') where title like '%文字%'
    先查出like '文字%'的结果,缩小查寻范围后再查like '%文字%'
    迁移不会用B树索引的,如果like '文字%'的结果集很小,like '%文字%'查询应该不太慢
      

  4.   

    mysql的新版本好象支持全文检索,大概能解决这个问题
      

  5.   

    mu_gua(木瓜)同志你怎么还是不明白呢?
    人家要的是 %文字% 形式的搜索结果
    你的SQL首先就只能查找出 文字% 的结果,缩小了范围,再到里面找  %文字% 有什么意义?
      

  6.   

    --------------------------------------------------------------
    您好,我们是“2006中国杰出数据库工程师评选”活动组委会。
    您的帖子已经被我们转载到本次评选官方网站的“专家在线答疑”区。
    http://www.bestdba.cn/match_discussion.aspx在那里,进入本次评选终选的30位数据库工程师将与您展开积极的互动。他们会为您的问题提供满意的答案,此外,您还可以在“专家在线答疑”区提出新的问题并参与讨论。您的帖子位于:
    http://www.bestdba.cn/match_discussion3.aspx?pointid=494&pointid2=1&pointid3=5&pcount=stc非常感谢您对本次活动的支持!
    --------------------------------------------------------------
      

  7.   

    回复mu_gua(木瓜):mysql的新版本虽然支持全文检索,但是我有测试过,检索结果精确度不够,会出现检索不到和检索错误,可能是他们本身算法的设计问题,会把经常出现的文字作为无效的分隔符.回复Simore() :谢谢你,看来也只有专家才能解决这个问题了.
      

  8.   

    select * from table_a where title like '%文字%' 
    '%文字%'里的文字是千变万化的,所以无法建立索引,因而用不到索引用不到索引,所以只能一行一行比较 title 和 '%文字%',因此记录越多,所用时间越慢如果想提高效率,不妨从你的业务逻辑上想办法
    比如:
    先把范围缩小 select * from table_a where title like '%文字%' and type='技术类'
    另外
    即使可以建立全文索引,如果是海量数据的话,还应进行分段查询
    比较明显的例子可以看看csdn的搜索"2004年前" "2004年"
      

  9.   

    mu_gua(木瓜)同志,理解上出错了.你先找出"文字%",那还用再找"%文字%"吗?chensiping,说得有点道理,在业务逻辑上处理,这样就能使用索引啦.搜索速度应该支大大的提高.
      

  10.   

    回复chensiping() :你的想法我也考虑过,但从业务逻辑上整个SQL是这样的,select * from table_a where status='1' and title like '%文字%' 我把status='1' 放在前面大概也只能缩小一半范围,因为status='0'的数据跟等于1的差不多,这样做是远远不够.
      

  11.   


      没办法解决的!   like '%str%' 是不会使用索引的.  可以考虑全文索引.
      

  12.   

    select * from (select * from table_a where title like '文字%') where title like '%文字%'是为了括号里边的查询能够使用索引,在不改变表结构和查询结果的条件下的实现。这种实现不比改变表结构的status='1'或者type='技术类'更好吗?为什么有些人不理解呢。
    以下部分摘自:MySQL手册版本 5.0.20 译者:叶金荣(Email:)出处:http://imysql.cn
    ----------------------------------------------------------------------------
    大部分MySQL索引(PRIMARY KEY, UNIQUE,INDEX 和 FULLTEXT)都是以B树方式存储。只有空间类型的字段使用R树存储,MEMORY (HEAP)表支持哈希索引。
    MySQL在做 LIKE 比较时也可能用到索引,如果 LIKE 的参数是非通配字符开始的固定字符串的话。以下的 SELECT 语句就用到了索引:SELECT * FROM tbl_name WHERE key_col LIKE 'Patrick%';
    SELECT * FROM tbl_name WHERE key_col LIKE 'Pat%_ck%';第一个查询中,只有的 'Patrick' <= key_col < 'Patricl' 记录才会被检索到。第二个查询中,只检索 'Pat' <= key_col < 'Pau' 的记录。以下 SELECT 语句不使用索引:SELECT * FROM tbl_name WHERE key_col LIKE '%Patrick%';
    SELECT * FROM tbl_name WHERE key_col LIKE other_col;第一个语句中,LIKE 的参数是以通配符开始的。第二个语句中,LIKE 的参数不是一个常值。
      

  13.   

    to zhengqingsong(冷风残月):
    你的数据量有多大啊,提高一倍还不能满足要求?
    你的业务逻辑是什么样的,仅仅只能以status来区分?
    __________________________解决之道:
    1试试全文索引.
    如果还达不到要求
    2加大数据库服务器硬件投入
    如果还不行
    3用数据库群集
    如果还不行
    恭喜你,你的项目非常巨大,可以考虑跟百度,google合作
    利用他们的专利技术一定可以解决.
      

  14.   

    to mu_gua(木瓜):
    明白你的意思
        能用索引就用索引,用不了也没有办法
    你的语句这样写才能表达你的意思
    select * from table_a where title like '文字%'
    union
    select * from table_a where title not like '文字%'
    否则,仅凭这句
    select * from (select * from table_a where title like '文字%') where title like '%文字%'
    查询结果不符合要求
    至于为什么不符合,你可以模拟一些数据来试试.然后再想想iloveyou123()的话.
      

  15.   

    如果是非事务表,用MyISAM引擎。我做过简单测试,百万条记录数据相同的表MyISAM的表比Oracle表快两个数量级
      

  16.   

    To chensiping(): 
    1试试全文索引.
    MYSQL的全文索引功能我有试过,但是查询结果不令人满意,可能是它本身机制的问题,把一些常出现的词汇都作为断字2加大数据库服务器硬件投入
    3用数据库群集
    恭喜你,你的项目非常巨大,可以考虑跟百度,google合作
    呵呵,项目不大,做这些投入囊中羞涩.....
      

  17.   

    To chensiping():
    数据量倒是不到,十万级数据量,但关键是每条记录都要对所有记录进行模糊匹配,找出数据库与该条记录的相关记录,这样查询次数相当与是10万*10万次,模糊查询的性能显然是远远不够的. 业务逻辑确实仅仅只能通过status排除不用的记录,其余的记录都需要进行相关性匹配.select * from table_a where title like '文字%'
    union
    select * from table_a where title not like '文字%'
    那不等于还是全部记录吗?
      

  18.   

    TO mu_gua(木瓜) :我的表已经是用MyISAM引擎的,并且对MYSQL的环境变量进行过优化
      

  19.   

    这是个棘手的问题
    like %str 不使用索引
    not like 不符合 SARG头疼
      

  20.   

    十万条数据不算很大啊,也不会慢到哪里去吧?'%abac%' 的效率没办法提高到哪里去1. 使用专门的检索技术,像全文检索
    2. 自己做索引了。
    3. 找搜索引擎公司 哈哈
      

  21.   

    十万数量级的话就别用数据库了,全load到内存中去处理
      

  22.   

    这样解决更好:
    建立一个有索引的 memory 临时表
    CREATE TEMPORARY TABLE ..... key ....然后将查询结果插入在临时表的基础上再进行下一步的操作过程完毕之后删除临时表