现有一企业数据库,企业信息表有大约1千万条记录的,现需要对这个企业数据库编写一个搜索应用程序,实行对企业名称字段进行模糊查询功能,对城市字段进行精确查询功能,要求查询速度和结果翻页速度小于一秒,请你简叙你对数据库的优化方案并给出相应的SQL语句。企业表结构
Name 企业名称
city 城市

解决方案 »

  1.   

    呵呵,如果是我,我会建两张表,第一张表为存放城市,字段(ID,CITY),第二张表存放企业名称(CITY_ID,NAME),两张表都建好索引,其中第一张表ID为主键,第二张表CITY_ID,NAME为主键

    SQL语句=
    select 查询的城市名 as city,name from 企业名称表 where city_id in (select id from 城市表 where city='查询的城市名') and name like '%查询的企业名片段%';如果当前就一张表不变的情况下
    企业表结构
    Name 企业名称
    city 城市
    设Name、city为主键,并建索引,
    SQL语句=select city,name from 企业表结构 where city='查询的城市名' and name like '%查询的企业名片段%'
      

  2.   

    要求查询速度和结果翻页速度小于一秒这个可以用XML数据存取来实现咯,不过要求有点变态呀,这个少于一秒没有什么准确数据的,在服务器上跑要少于一秒这个当然,但在客户端呵呵,有谁能做到100%少于一秒,哪他一定是神
      

  3.   

    所谓少于1秒,就是提醒你那种“where cityField like '%'+@Query+'%'”的查询方法是要被立刻淘汰的。
      

  4.   

    如果按照sp1234(心脏有点问题,少喝酒) ( ) 信誉:100    Blog 的说法
    一楼的做法应该是有问题的
    继续关注一下吧
      

  5.   

    是的,首先要审题,题目上有一些明显的提示,一定要懂得分析陷阱。1000万条记录,如果使用“like '%'+@包含文字+'%'”那样的查询条件顺序搜索,足可以回家先去喝酒吃饭睡一觉,然后再来看结果的了。如果网站上一个页面的查询就占用10个小时时间,网站立刻完蛋。如果不知道"like '%xxx'"是“顺序查询”而与索引无缘,数据库等于白学,没有动手做过实验。从你学数据结构的时候就学过“倒排”查询吧?应该记起来。关于分页,应该是考察你对一些asp.net表格控件对数据绑定的简单机制的理解程度。这个题对实际开发工作不足6个月的人不必提,而应该事后培训。
      

  6.   

    很想知道,对于模糊查询,不用like,那应该用什么?
      

  7.   

    再city上建立一个索引也许会快一些
      

  8.   

    MARK  这个还真不知道~
      

  9.   

    这个主要是考SQL的写法! 判断主键和索引的应用!
      

  10.   

    没人用过FullText Search么?
    不用like,而用contains,对企业那个字段建立全文索引,这样速度会快非常多不过他没说明是什么数据库,要那么高性能的分页不是容易事,或者要看城市数据和企业数据分布的均匀程度
      

  11.   

    我也在问,不用like,用啥呢,偶对数据库不太懂!
      

  12.   

    如果当前就一张表不变的情况下
    企业表结构
    Name企业名称
    city城市
    设Name、city为主键,并建索引,
    SQL语句=select city,name from 企业表结构 where city='查询的城市名' and name like '%查询的企业名片段%'这样建索引完全无效!可以用嵌套查询或临时表
      

  13.   

    首先人家说了要一秒,言外之意就是速度越快就越好,把什么网络啊、机器啊都考虑了那题就没法做了,那就是钻牛角尖了like是无法使用索引的,但是函数好像也不符合索引规则,什么contains、charindex也都不行的吧继续关注中
      

  14.   

    用like也没什么关系,可以分区,可以keep,可实现的方式多了
      

  15.   

    靠,直接用全文索引,like肯定完蛋。
      

  16.   

    我会对城市进行聚集索引。对城市,企业进行组合索引,使用临时表,然后like对临时表操作。应该能提高效率。全文索引也是不错的方法。
      

  17.   

    like 'xxx%' 是可以使用索引的
    like '%xxx' 是不可以使用索引的
    like '%xxx%' 也是不可以使用索引的
      

  18.   

    1. SQL 语句优化2. 这么多数据最好不要用like 要用全文索引3. 关键字段建立聚集索引 尽量尽力建在数据类型为数字的上面,比如性别这种字段不能加索引,数据量海量的时候加了比不加要慢很多。
      

  19.   

    嵌套查询select city,name from(select city,name from 企业表 where city=输入的城市) 
    where name like %xxx%第一次查询,可以让数据表里面的1千万条数据剩下很少.然后在这查询结果下再来模糊查询.
    如果翻页的话.用存储过程传入翻页参数以及每页要显示的条数,通过这样来翻页.这样的思路不知对不对,请楼下指点
      

  20.   


    在name上建一个索引(idx_name),
    在city上建一个索引(idx_city),
    sql如下:
    select/*+index(idx_city,企业表)*/ name,city
    from ( select/*+index(idx_name,企业表)*/ name,city
           from 企业表
           where name like '%企业名称%')
    where city = 城市
      

  21.   

    有人说不用like 语法。用instr()函数也可以。
    但是不知道哪个效率高。
      

  22.   

    在name上建一个索引(idx_name),
    在city上建一个索引(idx_city),
    sql如下:
    select/*+index(企业表,idx_city)*/ name,city
    from ( select/*+index(企业表,idx_name)*/ name,city
           from 企业表
           where name like '%企业名称%')
    where city = 城市
    更正。。很久没写了。语法都忘了。失败!!!!
      

  23.   

    刚才没有看到要分页。
    在补充。。呵呵。。在name上建一个索引(idx_name),
    在city上建一个索引(idx_city),
    sql如下:
    select  name,city
    from(
    select/*+index(企业表,idx_city)*/ name,city
    from ( select/*+index(企业表,idx_name)*/ name,city
           from 企业表
           where name like '%企业名称%')
    where city = 城市
    )
    where rownum > (i-1)*10
    and rownum <i*10i表示当前页(每页10条数据)。根据用户选择传进来。这样不用每次都把所有数据查出来。
      

  24.   

    刚才没有看到要分页。
    在补充。。呵呵。。在name上建一个索引(idx_name),
    在city上建一个索引(idx_city),
    sql如下:
    select  name,city
    from(
    select/*+index(企业表,idx_city)*/ name,city
    from ( select/*+index(企业表,idx_name)*/ name,city
           from 企业表
           where name like '%企业名称%')
    where city = 城市
    )
    where rownum > (i-1)*10
    and rownum <=i*10
    呵呵。。补充。要不每页会掉了一条数据