- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在执行大约 600 个 INSERT ON DUPLICATE KEY UPDATE
查询,其中每个插入可以有一组不同的列。
我现在的做法只是一个带有 mysql_query()
的 foreach 循环。真的很慢,php 脚本由于最大执行时间 30 秒而停止。
我不能使用 INSERT INTO table (columns) VALUES (values 1), (values 2), ..., (values n)
因为每个插入必须能够有一组不同的列。
我也查看了准备好的查询,但据我所知,它似乎也不适用于不同的列集。
我是数据库和MYSQL 的新手。我只是把一些东西拼凑成一个周末项目,现在我只想让项目的最后一部分开始工作。我很抱歉没有以正确的方式做到这一点。 (很抱歉也使用过时的 php mysql 函数。)也许我应该去 sleep ,稍后重写。正确的做法是什么?
编辑:这里是一些关于表格类型的信息
-- phpMyAdmin SQL Dump-- version 3.5.1-- http://www.phpmyadmin.net---- Host: localhost-- Generation Time: Jul 22, 2012 at 09:59 PM-- Server version: 5.5.24-log-- PHP Version: 5.3.13SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";SET time_zone = "+00:00";---- Database: `trailerbay`---- ------------------------------------------------------------ Table structure for table `movies`--CREATE TABLE IF NOT EXISTS `movies` ( `id` int(11) NOT NULL AUTO_INCREMENT, `imdb` int(7) NOT NULL, `title` text COLLATE utf8_unicode_ci, `releasedate` date DEFAULT NULL, `enlistdate` datetime NOT NULL, `runtime` time DEFAULT NULL, `trailer` text COLLATE utf8_unicode_ci NOT NULL, `plot` text COLLATE utf8_unicode_ci, `cover` text COLLATE utf8_unicode_ci NOT NULL, PRIMARY KEY (`id`), UNIQUE KEY `id` (`id`), UNIQUE KEY `imdb` (`imdb`)) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci AUTO_INCREMENT=1145 ;
最佳答案
我不认为你可以在表中有那么多列,以至于它们的开/关组合多得令人望而却步。
因此,对于每一行,您可以提取其列组合(例如,您可以按字母顺序对字段进行排序)并将其结构用作键:
// $tuple has been sorted based on keys
$syndrome = implode(',', array_keys($tuple));
$values = array_values($tuple);
if (isset($big_inserts[$syndrome]))
array_push($big_inserts[$syndrome], $values);
else
$big_inserts[$syndrome] = array($values);
在循环结束时,您会发现自己有一个包含一定数量键的 $big_inserts
数组。每个键将映射一组值的数组,适用于多次插入。
除非您真的非常不幸,否则您的“多次插入”将比开始时的单个插入少得多。如果所有插入都具有相同的列,则 big_inserts 中只有一个键,用于保存所有元组。
现在,在 big_inserts 上循环,并且您可以为每个键准备一个语句。要发送到 PDO 的值数组是 $big_inserts[$key]
中所有元组的串联。
foreach($big_inserts as $fields => $lot)
{
$SQL = "INSERT INTO table ($fields) VALUES ";
// I need a (?.?.?---) tuple
$tuple = '('.implode(',', array_fill(0, count($lot[0]), '?')).')';
// How many tuples are in a lot?
$SQL .= implode(',', array_fill(0, count($lot), $tuple));
$values = array();
foreach($lot as $set)
$values = array_merge($values, $set);
// Now $SQL has all the '?'s, and $values contains all the values.
// Run the statement.
}
如果这还不够,您可能必须将语句分成 block ,将它们保存在 session 中并按顺序执行每个 block ,可能使用单独的表来模拟“多往返”事务(以防连接丢失/用户关闭浏览器/任何已经执行了一半 block 而另一半仍在执行的内容。使用直接插入到具有相同结构的表中,然后当表准备好时在事务中运行一个 INSERT INTO ... SELECT FROM 和提交后删除辅助表。
如果它们是简单的 INSERT,我会尝试暂时禁用一些索引,但是您依赖它们进行 ON DUPLICATE KEY UPDATE,所以这是不行的。
关于php - 如何从 PHP 快速制作多个略有不同的插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11604192/
直接问题:对于一个类对象的三个(或更多)几乎相同的拷贝,我怎样才能最好(或最有效)地存储它们之间的差异? 背景:我有一个需要一组参数的算法: struct params { std::strin
我是一名优秀的程序员,十分优秀!