Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/70.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
Php 导出/导入不带索引的5000万行数据库?_Php_Mysql_Sql_Phpmyadmin_Innodb - Fatal编程技术网

Php 导出/导入不带索引的5000万行数据库?

Php 导出/导入不带索引的5000万行数据库?,php,mysql,sql,phpmyadmin,innodb,Php,Mysql,Sql,Phpmyadmin,Innodb,我有很多数据——5000万行。但是由于次优的选择,我选择了错误的索引,现在插入需要花费很多时间(插入1000行需要60秒) 我认为这是因为主键是多列的,每次插入后都需要对表重新编制索引(因为那些customerid和orderid不是以任何asccending/descending方式插入的,而是在随机位置插入的)。如果我在queueid上有一个主键是autoincrement,它会大大加快插入速度吗 我是否可以导出没有损坏索引的表?然后用更好的键重新索引它 我尝试过用SQL语句删除键,但花了很

我有很多数据——5000万行。但是由于次优的选择,我选择了错误的索引,现在插入需要花费很多时间(插入1000行需要60秒)

我认为这是因为主键是多列的,每次插入后都需要对表重新编制索引(因为那些
customerid
orderid
不是以任何asccending/descending方式插入的,而是在随机位置插入的)。如果我在
queueid
上有一个主键是autoincrement,它会大大加快插入速度吗

我是否可以导出没有损坏索引的表?然后用更好的键重新索引它

我尝试过用SQL语句删除键,但花了很长时间,我中断了它。有没有办法看到进展?如果我不知道我要等多久,我就不会等了——毕竟可能要等几天

我需要重新索引这个表,因为它最终将有10亿行,插入性能将进一步恶化


或者,最好放弃我已经插入的内容,用适当的索引创建一个新表?不要再费心重复使用旧数据了?

最大的问题是,这个表将用于什么?如果唯一的查询将是ORDER_ID的范围或ITEM_ID的聚合,那么您只需要在这些列上建立单独的索引。将队列ID设置为主键(因为自动递增确保了唯一且不为空)。请尝试以下操作:

更新:根据OP下面的评论,每个客户可以有多个订单ID,反之亦然,但组合必须是唯一的。在IMO中,更容易创建满足唯一约束的附属表,并在此
slots
表中使用该表中的索引

CREATE TABLE cust_order (
    combo_id int(11) NOT NULL AUTO_INCREMENT,
    customerid int(11) NOT NULL,
    orderid int(11) NOT NULL,
    PRIMARY KEY combo_id,
    INDEX customerid (customerid),
    INDEX orderid (orderid),
    UNIQUE KEY combination (customerid, orderid)
) ENGINE=INNODB;

CREATE TABLE `slots` (
 `combo_id` int(11) NOT NULL,
 `queueid` int(11) NOT NULL AUTO_INCREMENT,
 `item_id` int(3) NOT NULL,
 `variable1` int(3) NOT NULL,
 ...
 ...
 `variable9` tinyint(1) NOT NULL,
 PRIMARY KEY `queueid`,
 INDEX `combo_id` (`combo_id`),
 INDEX `itemid` (`itemid`),
 FOREIGN KEY (combo_id)
   REFERENCES cust_order (combo_id)
) ENGINE=INNODB;
您必须运行两个不同的insert查询。首先,加载组合表,它只处理数字索引而不处理卫星数据,而且速度应该非常快。之后,当您插入
插槽时
,通过customerid+orderid进行查找将非常快,您只需使用组合id作为外键


请注意必须使用InnoDB引擎才能使用外键。

您可以使用禁用键选项导出表

请参阅此链接

在phpMyAdmin中,首先使用操作复制表,但选择“仅结构”。然后在复制的表中,更改结构(删除不需要的索引)。然后从原始表中,使用操作将其复制到复制的表中,并使用“仅数据”


如果上次复制操作给您带来麻烦,请仅从原始表(从自定义面板)导出数据,然后将其导入复制的表。

显示插入查询。上次尝试的代码现在插入PHP脚本的工作方式如下:获取数据。创建500-1000行insert IGNORE语句(一次插入)执行INSERT IGNORE查询。还可以尝试以下几点:(1)使用多行插入添加数据,(2)在事务内将多个插入一起批处理(例如1000次),(3)这可能会给您带来一些性能改进。我需要确保customerid和orderid都是唯一的(一个orderid可以有多个客户,反之亦然)auto increment的高值是我的几个导入的残余-我想这就是它的来源。好吧,有什么有用的吗?请将任何答案标记为正确或发布您自己的答案。我必须删除所有数据并重建结构。我将很快发布我的解决方案-一旦我完成设置。谢谢您的帮助。
CREATE TABLE cust_order (
    combo_id int(11) NOT NULL AUTO_INCREMENT,
    customerid int(11) NOT NULL,
    orderid int(11) NOT NULL,
    PRIMARY KEY combo_id,
    INDEX customerid (customerid),
    INDEX orderid (orderid),
    UNIQUE KEY combination (customerid, orderid)
) ENGINE=INNODB;

CREATE TABLE `slots` (
 `combo_id` int(11) NOT NULL,
 `queueid` int(11) NOT NULL AUTO_INCREMENT,
 `item_id` int(3) NOT NULL,
 `variable1` int(3) NOT NULL,
 ...
 ...
 `variable9` tinyint(1) NOT NULL,
 PRIMARY KEY `queueid`,
 INDEX `combo_id` (`combo_id`),
 INDEX `itemid` (`itemid`),
 FOREIGN KEY (combo_id)
   REFERENCES cust_order (combo_id)
) ENGINE=INNODB;