表结构就只有:id,w1,w2,con 四列。id为自增主键,w1,w2 为单词,con 为两个单词间的关联度。由于每次添加内容都是批量地加入,几万十几万都有,所以,难免会有大量的重复数据,重复的就只保留一个,其中的con取平均值试着用:create temporary table tb select w1,w2,avg(con) as con from avgtable group by w1,w2;
创建临时表,再insert进一个新表来弄,才40多万的数据却用了我两三分钟,如果以后数据一多,那岂不是要崩溃(估计以后千万级是肯定的,上亿也有可能,怕怕啊~)?还有一个问题,就是我为了以后查询时只查一次,所以,把w1,w2不同顺序都记一条记录,即如 狗,猫,30 和 猫,狗,30 分成两条不同的记录,觉得无论以后是搜索或去重复都可以避免用到OR。不知道这样算不算空间换时间呢?这里,为了实现上面说的两词关联度有两条记录,如果使用类似:SELECT *from avgtable t1 where not EXISTS (SELECT * from avgtable t2 where t2.w1=t1.w2 and t2.w2=t1.w1);
那只能是悲剧了。想到好一点的方法,也许就是把所有记录的w1,w2顺序都反过来记一次,然后再按上面那样去重复。但是也可以预见,速度肯定让人抓狂!不知道各位大人是否有什么好的方法呢。小弟初学,什么都不懂啊,求各位大人发发好心,不吝指教啊?
是否数据库设计问题呢,是否还有其他隐藏秘技呢,或者是否能用索引之类的啊?
困扰我很久了~总之,求人惯例,先拜谢各位!

解决方案 »

  1.   

    create temporary table tb select w1,w2,avg(con) as con from avgtable group by w1,w2;针对这条,可以创建 create index xxxx1 on avgtable (w1,w2)
      

  2.   

    创建临时表,不如使用内存数据库,或者直接使用hashmap来处理
      

  3.   

    具体步骤可以这样:
    1.创建新表
    CREATE TABLE t_test_auto
    (id INT PRIMARY KEY AUTO_INCREMENT,
     w1 VARCHAR(10),
     w2 VARCHAR(10),
     con INT,
     UNIQUE KEY (`w1`,`w2`));
    2.将老表内容replace into 到新表
    3.删除老表
    4.将新标rename成老表
    5.对表中内容w1和w2对调再replace into到表中.
      

  4.   

    谢谢楼上各位大神们的回答。每条回复我都认真看了,也动手测试过。楼上的都说到了对w1,w2建索引,但是这招好像不适用啊,也就只缩短了大约10多秒而已。
    这次用了53万数据,加索引为7分40几秒左右,不加为8分多,不明显啊!还有,我那些w1,w2重复的数据,con列是不重复的,所以要求con的平均值。至于rucypli大神说的:导入数据毕竟偶尔导一次
    的确,但是每次改一次都要重新弄,真的不能忽略啊,而且更重要的是,它没有一个进度显示,
    我对它是否能够完成没有一个底啊!在这再次谢谢各位,希望还有其它方法。谢谢!
      

  5.   

    1 把这表类型改成MYISAM
    2 如果你的版本是5.1以上的话,可以自身表内删除的,不需要再建新表。
    3 有个土办法,把原表加上ID,之后把w1+w2和w2+w1,分别插入同一个表,之后再group by,选出最后留下的。
    id string
    1  w1_w2
    1  w2_w1
      

  6.   

    理解下你的要求.
    w1 w2 con
    1  1   6
    1  1   6
    1  1   12
    这样是不是取1 1 6及1 1 12取平均得到1 1 9?
    还是全部取平均得到1 1 8?
      

  7.   

    参考下这个http://www.yqshare.com/materialized-views-with-mysql.html,建个新表
    CREATE TABLE t_test_auto
    (id INT PRIMARY KEY AUTO_INCREMENT,
     w1 VARCHAR(10),
     w2 VARCHAR(10),
     cnt int comment '记录条数',
     con INT,
     UNIQUE KEY (`w1`,`w2`));
    利用trigger实现两表的同步.