Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 为什么SELECT-INSERT请求如此长?_Mysql_Lamp - Fatal编程技术网

Mysql 为什么SELECT-INSERT请求如此长?

Mysql 为什么SELECT-INSERT请求如此长?,mysql,lamp,Mysql,Lamp,我有一个LAMP服务器,具有快速的存储能力和大量的内存和处理器能力 有两个表具有相同的结构,一个表具有30.000.000条记录,另一个表为空。 我想将数据从第一个表复制到第二个表并使用此请求: INSERT INTO table2 SELECT * FROM table1 ; 此请求需要超过4小时才能完成。我认为这是不正常的,因为整个数据库的mysqldump不到一个小时就完成了 选择请求是否有任何限制?或者我必须使用其他代码来优化性能?这可能取决于管理任务,例如索引数据和分配存储空间 3

我有一个LAMP服务器,具有快速的存储能力和大量的内存和处理器能力

有两个表具有相同的结构,一个表具有30.000.000条记录,另一个表为空。 我想将数据从第一个表复制到第二个表并使用此请求:

 INSERT INTO table2 SELECT * FROM table1 ;
此请求需要超过4小时才能完成。我认为这是不正常的,因为整个数据库的mysqldump不到一个小时就完成了


选择请求是否有任何限制?或者我必须使用其他代码来优化性能?

这可能取决于管理任务,例如索引数据和分配存储空间

3000万是一大笔钱。您可以以位为单位进行查询,比如每个查询中有100-1000个结果

我建议您在操作区域中使用phpmyadmin,首先选择源表,您将看到复制表


如果要跨不同位置复制,请使用mysqlworkbench在新表中导出和导入。希望这有帮助。

确保模式与第一个表一样,然后在Insert查询中给出值的顺序。*降低Select查询的性能,NoLock提高数据可用性


当添加超过几千条记录时,尤其是当您正在写入的表未被使用时。在添加时关闭索引,然后再打开它们。如果您有多个索引,请全部执行

更改表名禁用键

导入数据并将其重新打开

更改表名启用键


有关详细信息,请参见插入通常比选择慢。慢三倍似乎有点太多了,但我不排除这种可能性。导入转储文件需要多少时间,而转储文件需要一个小时?您可能希望在插入期间…选择。是否有在表2中插入时运行的触发器?通过导入,可以从源中批量读取数据。通过SELECT/INSERT,它必须先读取一条记录,然后再写入它,然后继续执行3000万行中的每一行。这需要一段时间。设置操作系统和数据库的readahead缓冲区可能会有很大帮助,一次读取更多数据,从而减少磁头移动。非常感谢!我试试这个。此外,我还将从这里考虑优化:3000万是一小部分记录。重要的是记录的大小。如果一条记录的大小是1MB,那么它将是30000兆字节。或30Gb的数据写入。
Begin Tran
      INSERT INTO (Col1,Col2, Col3,...Coln) table2 
    SELECT (Col1,Col2, Col3,...Coln) FROM table1 with (NoLock)
Commit