目前有个这样的问题,不知道如何简表查询效率最高:数据量很大,但是数据可以用如下的方式分层分类:
简单举例:省份(30多个)-> 一级分区点(5万多个)-> 二级分区点(100多个)-> 最终数据点(上万个)如何建表结构检索效率最高?
初学者,非常感谢大家!

解决方案 »

  1.   

    我现在有几万个文本文件,每个文件有几万行。所有文件格式一样,可以按照如下方式分类:
    1. 按照文件名称,可以把文件分为30种类别,叫做“第一层类别”;
    2. 每个文件有4万行数据,每行2列,第一列是“属性名称”,相当于4万个枚举类型数值,且前后顺序固定;第二列是1到100之间的整数。需求是:
    当用户选择了某一个文件类别a和某一个属性名称b,以及某一个数值n时,可以把文件类别a中,所有的包含“属性名称b  数值n” 这一行的文件名都列出来;我的mysql表结构是这样:
    按照文件名的30种类别,合并为8类,每类按照数值1到100分别建一个表,共800个表,每个表的记录是属性名和文件名;我主要的疑惑:
    1. 我总觉得这样不是最优结构,担心将来检索速度太慢,但是总不能在mysql中存放几万个表吧?
    2. 数据量太大,导入mysql很费时间,如果不用数据库,有没有更好的解决方案?比如lucens
    因为检索系统是.net的,恳求各位高手多多指点,非常感谢大家!
      

  2.   

    一张表就行了。create table x(第一层类别 int,属性名称 varchar(10),某一个数值 int);
    create index xxx on x(第一层类别 ,属性名称 ,某一个数值 );
      

  3.   

    谢谢版主!
    我现在按照您的建议,建了一张表,按照数值范围做rang分区,现在有个奇怪的问题:为了加快导入速度,我把每个文件对应的信息按照mysql中表的格式写在文件中,然后用load infile导入mysql:
            public int loadFile2DB(string fileName)
            {
                MySqlConnection conn = new MySqlConnection(conStr);
                conn.Open();
                int flag = 0;
                try
                {
                    string infoQuery = "load data infile '" + fileName)+ "' into table infoall(class1, attribute, value);";
                    MySqlCommand cmd = new MySqlCommand(infoQuery, conn);
                    cmd.ExecuteNonQuery();
                    flag = 1;
                }
                catch (InvalidCastException e)
                {
                    logger.logRecord("Load err: "+fileName );
                }            conn.Close();
                return flag;
            } 但是这个只循环到几百个文件,就会出现catch 中的Load err错误,我把程序停下来,直接用mysql命令导入也是可以的,或者重启程序再次导入也可以。我以前用同样方法,可以导入很多,是不是和mysql的响应时间有关?
      有什么方法可以用程序持续的导入?几百个就手动重启程序太繁琐了,谢谢!
      

  4.   

    补充一下,我以前用800个表分开存放的时候,导入很多文件之后,才会出现catch错误,
    这是否与mysql的设置有关?
      

  5.   

    问题解决了,
    cmd.CommandTimeout = 90;//这个默认是30,改大一些,就可以了,
    非常感谢各位!