下面是5.1官方文档上面的说明
CREATE TABLE new_tbl LIKE orig_tbl;
The copy is created using the same version of the table storage format as the original table. The SELECT privilege is required on the original table.LIKE works only for base tables, not for views.CREATE TABLE ... LIKE does not preserve any DATA DIRECTORY or INDEX DIRECTORY table options that were specified for the original table, or any foreign key definitions.If the original table is a TEMPORARY table, CREATE TABLE ... LIKE does not preserve TEMPORARY. To create a TEMPORARY destination table, use CREATE TEMPORARY TABLE ... LIKE.大家有什么想法没?为什么会执行这么久,这么久会不会意味这以后线上操作别用like,直接用show create table t2,然后再copy进行create?
这个感觉一点思路都没有,而且现在还没有开始看源码,不好从源码入手查找。

解决方案 »

  1.   

    show create table t2;
    show create table t1;贴出来看一下。
      

  2.   

    create table new_tbl like old_tbl;之所以会比较慢,先对直接CREATE TABLE来说,我觉得是因为在建表的时候,对OLD_TBL的信息进行了统计,这个过程比较慢。试试new_tbl 是空记录的看看,是不是不慢。
      

  3.   

    TRY:
    CREATE TABLE NEWTT AS 
    SELECT * FROM TT WHERE 
      

  4.   

    table的结构贴出没意义,这个现象假如经常对大表操作应该会遇到过的。CREATE TABLE NEWTT AS  SELECT * FROM TT WHERE,哥,谢谢你的回复,这两个差别很大,一个只是列名+数据,另外一个是完整的表结构包括索引,是否包含触发器这个不太清楚我尝试了一个100w数据的表还是很快。
    表结构信息我记得mysql high performance中说是保存在tablespace中的,既然保存在tablespace中,应该就不会这么慢
    没有办法看源码,所以比较困惑。
      

  5.   

    我来猜一下看。楼主的引擎应该是INNODB的,这样的话,SHOW TABLE STATUS里面的信息有些是估算的,在LIKE新表的时候,新表的CREATE TABLE命令其实是把老表的SHOW TABLE STATUS里面的信息全部带上了再执行的,这样才能保证新老表是一模一样的。当数据量很大的时候,获取准确的STATUS参数花的时间就越大。create table newtbl as select * from oldtbl where 1=0;这样速度应该很快。
      

  6.   

    理论上速度和表的记录数应该没有关系。
    CREATE TABLE new_tbl LIKE orig_tbl; 只不过是创建一个新的空表。它只是需要得到原表的create table语句中的相关信息,它会复制源表的字段和索引。你的慢是所有表都慢?还是仅某个表? 还是象大家猜的一样,包含大量数据的表?
      

  7.   

    恩,我用的是innodb。
    包含了大量数据的,数据量应该是上千万的,我也觉得不应该和表的数据量有关系,所以产生了很多的怀疑。
    按照左左的猜测,为什么show create table会非常快,即使数据量很大,也没有一点问题,这个问题感觉只能是阅读源码才能解释了
      

  8.   

    据我理解show create table,好像是直接从系统表里面获取信息。--当你create table时,表定义的细节被记录下来,show的时候,直接使用那些记录。