公司目前有一个需求在5W左右的数据上  对一字段(varchar) 实现 :模糊快速 检索。说下我目前做的一些实验:mysql5:对该 字段 建立索引:  查询  like  '%NNN'      在java程序上用时   50ms(毫秒)左右  sql2000:对该 字段 建立索引:  查询  like  '%NNN'     在java程序上用时   40ms左右           对该 字段 建立全文索引:可以实现模糊查询     在java程序上用时   100ms左右  lucene : 对该 字段 建立索引(并保存所有数据)  可以实现模糊查询     在java程序上用时   170ms左右  
领导说效率太低了:领导希望在 该数据量(5W+)下模糊查询:10ms以下  模糊查询的定义:  如:  输入   “北京 + 空格 + 商场”  把包含  北京  和 商场  (北京 和 商场 的位置可前可后——可互换位置) 的数据都查出:(4)  如果将 北京   和 商场 给索引了(2列数据)  怎么查出  都包含 北京和商场的对应数据
领导给我一个建议(索引表——我不了解是什么):他给我解释是: 先将 该字段  分词  建立一个表(table2) ,再在table2上做索引,然后再搜索。我是一个才毕业的学生,因为水平有限,请各位前辈都给点指点和意见!您的回答:1:5W+数据量下 10ms以下 的模糊查询(如上解释)是否能否实现?2:如果1能实现,实现的方法是?(如果能够自信请仔细点)3:其他方法建议(可能提高数据检索的速度和实现模糊查询功能)!!!4:(4如上标注)怎么实现?希望各位前辈和朋友不吝赐教!不会的朋友也可以学学数据检索方面的知识。来给意见和回答的朋友都给分,分不够则加。。希望都来说一下!!我都弄了2个星期了,还是没什么眉目!!再次谢谢 各位了!!

解决方案 »

  1.   

    这跟数据库无关
    你们领导说的就是解决问题的办法
    先分词,再对分词做索引三言两语说不清楚,你自己看看lucene的相关内容
      

  2.   

    我做了个测试,在一 mysql5 张表中2个字段 (id int auto , name  varchar )name 保存 1——20000的 字符(2W个记录)
    我给name 做了索引,select * from table where name='number'    (number是个 1---20000的数字);
    这样的准确查询(在java程序中)最少都需要20ms,怎么才能达到10ms的要求啊? 
      

  3.   

    呵呵,楼主没有明白领导的意思。
    不过,你们领导的意思也够可以的,如果我有一条数据,天津汽车。然后我输入条件 “津汽” 估计你不会给我把天津汽车查出来吧。那个时候,你要判断,你收录的那个信息表中有没有记录,如果没有,还是要按照正常搜索的。领导的表估计是如下三个字段:
    id , name , 主表的主键序列(以逗号分隔)
    1     天津     1,3,5,6,7,8,9,....
    2     汽车     1,2,3,4,5,9,....
    3     北京     2,3,5,6,9,......   
    4     XXX     3,4,5,6,7,8,....
    然后在 name 上建索引,或者不要id字段,name就是主键。楼主是否明白意思了:
    然后,这其实是2条sql语句,由于主键已经知道了,SQL 语句的 in (主键) 的速度其实是很快的。
    如果索引表命中的话,主表在100W条数据量的情况下,查询时间在 10ms 以内应该问题不大。除非你的机器是286.
    但是,要是没有命中,楼主就不得不按照正常方式查询了。
      

  4.   


    13楼的朋友。。你们一般怎么测试查询所需的时间的?(我是通过java程序查看的时间)如:long begin = new Date().getTime();
    conn.executeQuery("SELECT * FROM lucenesearch.indextest i where i.name in(19456)");
    long end = new Date().getTime();
    System.out.println((end - begin)+"毫秒");
      

  5.   


    请问一下 ,。你们一般怎么测试数据库查询所需的时间的? 
    (我是通过java程序查看的时间)如:long begin = new Date().getTime();  //开始时间
    conn.executeQuery("select * from sichuan where id=16547");  //执行查找
    long end = new Date().getTime();   //结束时间
    System.out.println((end - begin)+"毫秒");像这样的一个 准确查找 平均都需要 30 毫秒
      

  6.   

    select语句前加:
    declare @d datetime
    set @d=now()
    并在select语句后加:
    select timediff(now(),@d) as 语句执行花费时间(毫秒)
      

  7.   


    declare @d datetime
    set @d=now() 
    select * from sichuan where id=18652;
    select timediff(now(),@d) as b;运行不起啊!前辈给个能运行,并且能看到相差时间的 完整代码 行吗?
      

  8.   

    我是在SQLYOG中运行,没有问题
      

  9.   


    无语了。。
    我在 mysql-aministator和 mysql-front以及 dos下都运行不起!
      

  10.   

    在SQLYOG中:
    set @d=now();
    select * from sichuan where id=18652;
    select timediff(now(),@d) as b; 
    结果有2个,我测试过的,注意分号结束,呵呵