我一直在导入大量CSV数据文件; 通常少于100,000条记录.我正在使用PHP和MySQL(InnoDB表).我需要使用PHP来转换某些字段并在MySQL之前进行一些文本处理INSERT
(process_note_data()
下面代码的一部分).MySQL LOAD DATA
是不可行的,所以请不要建议.
我最近尝试使用START TRANSACTION
和使用MySQL事务来提高此过程的速度COMMIT
.性能提升令人惊讶.处理时间减少了20倍.因此,20分钟的处理只需要大约1分钟.
质询.
1.)有谁理解为什么有这样的性能提升(20分钟到1分钟)?
2.)我应该关注10万条记录的交易量有多大?
3.)我是否应该关注交易中的大量插入和/或更新?
/*
* Customer Notes Data:
* Rows are either a meeting, call or note!
*/
$row = 1;
$data = array();
$fields = array();
$line = '';
$db->query('SET autocommit=0;');
$db->query('START TRANSACTION;');
if (($handle = fopen("modules/".$currentModule."/Data/customernote.csv", "r")) !== FALSE) {
while (($data = fgetcsv($handle, 4096, ',', '"')) !== FALSE && $row < 999000) {
//Row 1 - CSV header row with field …
Run Code Online (Sandbox Code Playgroud) 我是MySQL的新手,我对它知之甚少.
我面临的问题如下所述:
以前我的数据有MyISAM作为它的MySQL引擎,过去需要大约15分钟才能在任何机器上导入.但是,当我将引擎更改为InnoDB时,需要花费大约90分钟才能在任何机器上导入.请建议我同样的.
我有一个巨大的InnoDB表,有三列(int,mediumint,int).在innodb_file_per_table
设置上,并且只有一个PRIMARY KEY
头两列的
表模式是:
CREATE TABLE `big_table` (
`user_id` int(10) unsigned NOT NULL,
`another_id` mediumint(8) unsigned NOT NULL,
`timestamp` int(10) unsigned NOT NULL,
PRIMARY KEY (`user_id`,`another_id `)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
Run Code Online (Sandbox Code Playgroud)
MySQL版本是5.6.16
目前我每秒多插入超过150行.没有删除,也没有更新.没有重大的回滚或其他事务中止,这将导致浪费的空间使用.
MySQL在该表上显示计算出的大小为75,7GB.
光盘上的.ibd大小:136,679,784,448字节(127.29 GiB)
计数行:2,901,937,966(每行47.10字节)
2天后,MySQL在该表上显示的计算大小为75.7 GB.
光盘上的.ibd大小:144,263,086,080字节(135.35 GiB)
计数行:2,921,284,863(每行49.38字节)
跑步SHOW TABLE STATUS
表显示:
Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Collation
InnoDB | 10 | Compact | 2645215723 | 30 | …
Run Code Online (Sandbox Code Playgroud) 在使用myisam引擎运行查询时,因为它不是事务性的,所以长查询(据我所知)不会影响其他查询的数据.
在InnoDB中,它警告的一件事是避免长时间的查询.当InnoDB快照时,是否会快照一切?
我之所以这么说是因为:无论出于什么原因,查询都会花费比平时更长的时间并最终回滚.同时,其他200个用户已将行更新或插入数据库.当长查询回滚时,它是否还删除其他用户所做的更新/插入?或者是涉及其他用户安全的行,除非他们越过那些被回滚的行?
我在LOAD DATA INFILE
InnoDB表上使用,我看到"系统锁定"状态SHOW PROCESSLIST
.在这种情况下,InnoDB究竟锁定了什么?如何查看锁定的内容?
我正在将我的应用程序迁移到Django并使用他们的内置ORM而不是编写SQL查询.我遇到的问题是与我的多对多关系中的一个.我有以下型号:
class Orgs(models.Model):
org = models.AutoField(primary_key=True)
org_name = models.CharField(max_length=45, null=False)
org_hood = models.CharField(max_length=60, null=False)
creation_date = models.DateField(auto_now_add=True)
class Members(models.Model):
member_ID = models.AutoField(primary_key=True)
user = models.OneToOneField(User)
nick_name = models.CharField(max_length=20, null=False)
is_self_managed = models.BooleanField(default=True)
orgs = models.ManyToManyField(Orgs, null=True)
Run Code Online (Sandbox Code Playgroud)
有许多组织和许多成员.成员可以是许多组织的一部分,组织可以有许多成员.每个成员都有一个余额(0.00美元)与他们所属的组织相关联.例如:
member1 is in Org1 with a balance of $3.85
member1 is in Org2 with a balance of $2.00
member2 is in Org1 with a balance of $0.85
Run Code Online (Sandbox Code Playgroud)
我无法弄清楚如何定义这个平衡字段.当我没有使用ORM时,我手动创建了连接表,并在连接表中定义了我需要的这些字段.
Jeremy Cole 的演讲《InnoDB:核心之旅 II》似乎表明有 128 个插槽,每个插槽可以有 1024 个事务。因此,我将记录在日志文件中的更新硬性限制为 2^17 次。
我正在寻找一种方法来从 ibdata1 和 ib_logfile[01] 文件中的撤消和重做日志轮换更新。如果我可以静态地或从配置动态地确定撤消和重做日志条目的最大数量是多少,那么我可以强制对系统进行大量更新,从而轮换出我试图删除的数据文件。
如果 Jeremy Cole 可以从字面上理解,则 131,072 次更新应该轮换出记录中列的原始值。或者比这更复杂?
innodb ×6
mysql ×5
csv ×1
django ×1
locking ×1
many-to-many ×1
myisam ×1
mysql-5.6 ×1
orm ×1
php ×1
primary-key ×1
sql ×1
transactions ×1