1。 mysql里面对于联合主键是具体怎么实现的?kd树还是其它?
  比如:
  SQL codecreate table example(
          id int auto_increment,
          time datetime,
          value int
          primary key(id, time)
          key (value)
    );
2. 我的程序里面大概需要插入4000万到6000万这个数量级的数据到example这个表,测试表明如果不做联合主键,只用自增字段id作为单独主键并且不为value字段做索引的话,可以在半个小时左右做完(在配置8核,64G内存的服务器上)。
  但是如果按上面那样,建联合主键(其实是要按照time做分区表,所以不得不把time加到主键里面)并且为value字段加上索引(方便以后查询用),时间就会大很多倍,大概需要8个小时左右,足足多了10倍以上  想问有什么办法可以提高一点速度么?先关索引,或者等数据插入完毕再来建索引和加主键,在数据量这么大的表上有可操作性么?对于分区表,能不能只为其中某些分区表建主键或者索引,而不是整个表?

解决方案 »

  1.   

    每张MyISAM 表被存放在三个文件 。frm 文件存放表格定义。 数据文件是MYD (MYData) 。 索引文件是MYI (MYIndex) 引伸。在处理超大数据量插入的时候,可以先建立一个没有索引的表,进行插入,这时的插入效率必定比有索引的高。插入后再建一个结构一样的表,并创建索引,然后把这个表的索引文件名称改名为大数据表的名称,重新启动服务,这时超大表的索引就加上了。对MYISAM表可以这么操作,INNODB就没辙了。
      

  2.   

    上面两位说的都很好,但是我这个表有个问题,它必须要按time做分区!
    比如,如果我等某天的数据插入后对表增加了索引和主键,那么第二天插入的时候就等于对一个已经有索引的表进行操作了。
      

  3.   

    1。 mysql里面对于联合主键是具体怎么实现的?kd树还是其它?MYSQL中一般会使用BTREE来存储索引数据。
      

  4.   

    没有什么好办法。 一般来说大量数据加载,特别是系统初始化一些表的时候,可以先取消索引,等LOAD DATA结束后再统一建索引可以减少总时间。 因为每插入一条记录就去维护索引文件比把数据先加载完后再一次性重新生成索引要花更多的时间。
      

  5.   

    因为使用联合主键因此需要不停的调整二叉树,因此会慢很多
    mysql5.1版本对auto_inc锁进行了改进了,5.1的速度会比5.0高
      

  6.   

    我用的环境就是5.1版本的mysql
      

  7.   

    那KD树是做什么的?跟B树有什么重要区别或者应用对象的不同呢?
      

  8.   

    KD树是什么,我根本不关心。我只需要知道MYSQL支持的索引有 BTREE,HASH ,RTREE这三种就可以回答你顶楼的问题了。如果楼主需要详细了解,建议在GOOGLE中搜索一下,相信会有许多解释和例子。