一个企业信息数据表,包含1000万条数据
company表包含城市和行业信息:
city varchar(10)
industry varchar(10)city表
cid int
name varchar(50)
code varchar(10)这里的code是城市代码,隐含上下级关系,譬如湖北01,武汉是:0101,这样查询时似乎方便一点,查湖北的企业直接查01开头的就行了,industry表的设计也类型。请问如何设计company表能具有很好的查询性能,主要是对城市和行业就行查询。插入性能可以不予考虑,表的数据变化情况不大。
是否需要建立company_city和company_industry表,在company_city的city列上建立聚集索引,在company_industry表的industry列上建立聚集索引?请指点。谢谢!//bow

解决方案 »

  1.   

    这里的code是城市代码,隐含上下级关系,譬如湖北01,武汉是:0101,这样查询时似乎方便一点,查湖北的企业直接查01开头的就行了,如果是城市的话,直接使用国家行政代码还好些.例如(这里是全部的代码:http://www.stats.gov.cn/tjbz/xzqhdm/t20041022_402267778.htm)代码 名称110000 北京市
    110100  市辖区
    110101   东城区
    110102   西城区
    110103   崇文区
    110104   宣武区
    110105   朝阳区
    110106   丰台区
    110107   石景山区
    110108   海淀区
    110109   门头沟区
    110111   房山区
    110112   通州区
    110113   顺义区
    110114   昌平区
    110115   大兴区
    110116   怀柔区
    110117   平谷区
    110200  县
    110228   密云县
    110229   延庆县
      

  2.   

    建立一个城市表CITY,以CITY为主键,以CODE为聚集索引
    建立一个行业表INDUSTRY(因为行业也可能是有分支的,可以像CITY一样设计,便于扩充)
    建立一个公司表COMPANY(应该是描述公司信息的,公司也有总公司,分公司之类的区分,所以也像CITY一样设计;如果不考虑公司的总分关系,也可不要分类)建立对应关系表(具体怎样对应,得看你的需求,这里理解的一个公司可能在一个城市对应多个行业)公司ID,城市ID,行业ID
      

  3.   

    对于多用于查询的大表,数据类型还是有很大影响的。以下是一点建议:使用两个子表,
    city表,
    cityID   smallint
    name    varchar(50) 
    code    varchar(10)industry表,
    industryID   smallint
    name    varchar(10) 在主表里面使用city和industry的ID
    cityID        smallint
    industryID    smallint
    其他字段....这里使用smallint是因为它的范围在 -32,768和32,767之间,完全可以列举所有的城市和行业,但只占2个字节可别小看这两个字节,如果你有1000万条记录,
    单是一个字段就占 10,000,000 * 2 / 1024 / 1024 = 19M
    如果用varchar(10)的话,数据冗余相当多,按平均每个city占2个汉字算,4个字节,需要38M以上的空间,对于vchar本身还有些系统上的开销
    表面上看,节省19M的磁盘空间几乎微不足道,但是,你在这个字段上建的索引体积也随之减少,
    字段和索引本身占的空间越小,每个页上的记录就越多,SQL每一次I/O请求都入内存的数据就越多,速度就越快
    磁盘空间虽然是最便宜的,但磁盘I/O是最慢的,最影响性能的。我见过一个电信计费系统的表,很多字段都是用bit, tinyint,就是为了提高速度,对大系统而言,每节省一个bit都有可观的回报。原则就是,在主表中尽量避免冗余的数据,使用ID去关联相关的子表。不过,如果表记录不多的话,不必像上面那样计算到字节,嘿嘿
      

  4.   

    回 “潇洒老乌龟”
    如果不建索引,对于这种大表,就是full table scan,太慢了吧。
      

  5.   

    有必要建立 company_city 和 company_industry表么?
      

  6.   

    如果是按照我2楼的方法,可以不需要索引. 
    按照代码2,4,6位匹配省,市,区县即可.
    因为对code的索引可能失效,所以我建议你自己试试
      

  7.   

    发表于:2007-11-28 14:18:2214楼 得分:0 
    有必要建立   company_city   和   company_industry表么? ----!!!!!!!
    有必要但企业最好以唯一的编号表示
    然后相应的建立城市表,行业表,以及企业表以下借用puremoon2008的部分发言:
    建立一个城市表CITY,以CITY为主键,以CODE为聚集索引 
    建立一个行业表INDUSTRY(因为行业也可能是有分支的,可以像CITY一样设计,便于扩充) 
    建立一个公司表COMPANY(应该是描述公司信息的,公司也有总公司,分公司之类的区分,所以也像CITY一样设计;如果不考虑公司的总分关系,也可不要分类) 到数据库中查找COMPANY表时尽量使用对应的编号缩小范围。
    就我的经验来看,这种查询的速度通常应小于1秒,(在普通2.0G致强服务器,1G内存的环境下),甚至更快一些。如果速度慢可以考虑增加一些内存,效果会比较明显。
      

  8.   

    有必要建立   company_city   和   company_industry表么?
    ---------------------------
    我在10楼里面说的就是这两个子表了,一定要有的,否则数据冗余非常大
      

  9.   

    create table company
    (
      companyname varchar(40)
      citycode   int 
      industrycode tinyint    
    )create table industry
    (
      industryname varchar(10)
      industrycode tinyint
    )create table city
    (
      cid   smallint identity(1,1) 
      name   varchar(40)  
      citycode int
    )
    我觉得三张表就够了 为什么还要另外两张
      

  10.   

    create   table   company 

        companyname   nvarchar(20), 
        citycode       int,   
        industrycode   tinyint         
    ) create   table   industry 

        industryname   nvarchar(10), 
        industrycode   tinyint 
    ) create   table   city 

        cid       smallint   identity(1,1),   
        name       nvarchar(20),     
        citycode   int 

    industry、city都是小表 没必要加索引company表如果查询的条件常常是citycode、industrycode的组合 可以给industrycode和citycode分别加索引 簇级索引就自己看吧
      

  11.   

    thanks是有可能频繁的模糊匹配公司名,这个改怎么处理?
      

  12.   

    那考虑要不要对companyname做个全文索引..