MySQL 对 MyISAM、InnoDB 批量插入经验总结
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了MySQL 对 MyISAM、InnoDB 批量插入经验总结,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2241字,纯文字阅读大概需要4分钟。
内容图文
null|array $data * @param int $rows * @return string */ protected function getInsertFieldValues(array $data, $rows) { $data && $this->data($data); $data = $this->getData(); $fields = $holders = $bind = array(); foreach ($data as $k => $v) { $fields[] = $k; $holders[] = ‘?‘; } $vals = ‘ , ( ‘ . implode(‘ , ‘, $holders) . ‘ )‘; return ‘( ‘ . implode(‘ , ‘, $fields) . ‘ ) VALUES ‘. ltrim(str_repeat($vals, $rows), ‘ ,‘); } /**
* 将多行数据共用一个 INSERT 语句进行批量插入
* 速度最快, 但插入失败时只能大范围的元素块, 而不能精确到某一行
* 其次, 每次插入占位符总数不能超过 65535 个, 程序将自动判断占位符数量并对列表进行分页插入
* 该方法对 innoDB 引擎和 MyISAM 引擎速度相差不大
* @param array $list
* @return int|array 成功则返回行数, 失败返回包含错误部分的所有元素(但不能精确到具体某一行)
* @throws Exception
*/
protected function addAllMoreInRow(array $list) {
$rowsNum = count($list);
if (isset($list[0])) $row = $list[0];
else {
$row = array_shift($list);
array_unshift($list, $row);
}
// 每一行的占位符数量
$holdersNum = count($row);
// 计算对数组分割每块最大元素数量
$chunkSize = min(array(50000, floor(65535/$holdersNum)));
// 获得批量插入语句模版并进行预编译
$query[0] = ‘INSERT INTO‘;
$query[1] = $this->getTable();
$query[2] = $this->getInsertFieldValues($row, $chunkSize);
$this->prepare($query);
// 保存之前已设置的绑定数据
$defaultBind = $this->bind ? $this->bind : array();
// 对数组按页分组
$list = array_chunk($list, $chunkSize, true);
// 最后一页索引
$last = count($list) - 1;
// 将数组分成多块单独绑定数据再进行按页插入
foreach ($list as $p=>$block) {
// 最后一页因数量不一致需重置预编译模版
if ($p == $last) {
$this->reset();
$query[2] = $this->getInsertFieldValues($row, count($block));
$this->prepare($query);
}
$this->bind = $defaultBind;
foreach ($block as $r=>$data) {
foreach ($data as $k=>$v) {
$this->bind[] = $v;
}
}
$result = $this->execute($this->bind);
if (! $result) return $block;
}
$this->reset();
return $rowsNum;
}
版权声明:本文为博主原创文章,未经博主允许不得转载。http://blog.csdn.net/zhouzme
MySQL 对 MyISAM、InnoDB 批量插入经验总结
标签:mysql myisam innodb 批量插入 instance
本文系统来源:http://blog.csdn.net/zhouzme/article/details/46987249
内容总结
以上是互联网集市为您收集整理的MySQL 对 MyISAM、InnoDB 批量插入经验总结全部内容,希望文章能够帮你解决MySQL 对 MyISAM、InnoDB 批量插入经验总结所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。