- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的项目中使用 Zend Framework。我需要插入多条记录,我发现 Zend_Db 比 my_sql 查询慢得惊人(好几次),这让我觉得我做错了什么。这里有两个例子。
Zend_Db_Adapter:
$startTime = microtime(true);
$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
$dateAdded = date('Y-m-d H:i:s');
$lastChanged = $dateAdded;
foreach ($importDataNamespace->data as $subscriberNum => $subscriber)
{
foreach ($fieldsMap as $fieldNumber => $fieldTag) {
if (isset($subscriber[$fieldNumber])) {
$subscriberData[$fieldTag] = $subscriber[$fieldNumber];
} else {
$subscriberData[$fieldTag] = '';
}
}
$query = 'INSERT INTO subscribers (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) ' .
'VALUES (' . 52 . ', ' . 29 . ', ' . $db->quote($subscriberData['EMAIL']) . ', ' . $db->quote($subscriberData['FNAME']) .
', ' . $db->quote($subscriberData['LNAME']) . ', ' . $db->quote($dateAdded) . ', ' . $db->quote($lastChanged) . ')';
$db->query($query);
}
$db->commit();
$this->view->time = microtime(true) - $startTime;
mysql_query 示例:
$startTime = microtime(true);
$user = 'root';
$password = 'password';
$db = 'database';
$connect = @mysql_connect('localhost',$user,$password) or die("Failed to connect database");
@mysql_select_db($db) or die("Failed to select database");
$dateAdded = date('Y-m-d H:i:s');
$lastChanged = $dateAdded;
$result = mysql_query('SET autocommit = 0');
foreach ($importDataNamespace->data as $subscriberNum => $subscriber)
{
foreach ($fieldsMap as $fieldNumber => $fieldTag) {
if (isset($subscriber[$fieldNumber])) {
$subscriberData[$fieldTag] = $subscriber[$fieldNumber];
} else {
$subscriberData[$fieldTag] = '';
}
}
$query = 'INSERT INTO subscribers (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) ' .
'VALUES (' . 52 . ', ' . 29 . ', \'' . mysql_real_escape_string($subscriberData['EMAIL']) . '\', \'' . mysql_real_escape_string($subscriberData['FNAME']) .
'\', \'' . mysql_real_escape_string($subscriberData['LNAME']) . '\', \'' . $dateAdded . '\', \'' . $lastChanged . '\')';
mysql_query($query);
}
$result = mysql_query('SET autocommit = 1');
$result = mysql_query('COMMIT;');
$this->view->time = microtime(true) - $startTime;
在第一种情况下需要 14.8 秒,在第二种情况下需要 3.7 秒。你能告诉我为什么会这样吗?你做错了什么?
如果我删除 Zend_Db 的任何引号,从带引号的 14 秒开始需要 12 秒,但它仍然比使用 mysql_query 慢得多:
$startTime = microtime(true);
$db = Zend_Db_Table::getDefaultAdapter();
$db->beginTransaction();
$dateAdded = date('Y-m-d H:i:s');
$lastChanged = $dateAdded;
foreach ($importDataNamespace->data as $subscriberNum => $subscriber)
{
foreach ($fieldsMap as $fieldNumber => $fieldTag) {
if (isset($subscriber[$fieldNumber])) {
$subscriberData[$fieldTag] = $subscriber[$fieldNumber];
} else {
$subscriberData[$fieldTag] = '';
}
}
$query = 'INSERT INTO subscribers (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) ' .
'VALUES (' . 52 . ', ' . 29 . ', \'' . $subscriberData['EMAIL'] . '\', \'' . $subscriberData['FNAME'] .
'\', \'' . $subscriberData['LNAME'] . '\', \'' . $dateAdded . '\', \'' . $lastChanged . '\')';
$db->query($query);
}
$db->commit();
$this->view->time = microtime(true) - $startTime;
感谢您提供有关此问题的任何信息。
此代码使用 mysql_query 大约需要 0.065 秒:
$dateAdded = date('Y-m-d H:i:s');
$lastChanged = $dateAdded;
$startTime = microtime(true);
$result = mysql_query('BEGIN');
for ($i = 0; $i < 100; $i++) {
$email = 'test_ ' . $i . '@gmail.com';
$query = 'INSERT INTO subscribers (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) ' .
'VALUES (' . 52 . ', ' . 29 . ', \'' . mysql_real_escape_string($email) . '\', \'' . mysql_real_escape_string($firstName) .
'\', \'' . mysql_real_escape_string($lastName) . '\', \'' . mysql_real_escape_string($dateAdded) . '\', \'' . mysql_real_escape_string($lastChanged) . '\')';
mysql_query($query);
}
$result = mysql_query('COMMIT');
$time = microtime(true) - $startTime;
echo 'Using mysql_query: ' . $time . '<br />';
exit();
使用 Zend_Db_Adapter 基准的代码(在这种情况下我什至没有使用引号):
$db = Zend_Db_Table::getDefaultAdapter();
$db->getProfiler()->setEnabled(true);
$profiler = $db->getProfiler();
$startTime = microtime(true);
$db->beginTransaction();
for ($i = 0; $i < 100; $i++)
{
$email = 'test_' . $i . '@gmail.com';
$query = 'INSERT INTO subscribers (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) ' .
'VALUES (' . 52 . ', ' . 29 . ', \'' . $email . '\', \'' . $firstName .
'\', \'' . $lastName . '\', \'' . $dateAdded . '\', \'' . $lastChanged . '\')';
$db->query($query);
}
$db->commit();
$time = microtime(true) - $startTime;
echo 'Time of transaction Zend_Db_Adapter query: ' . $time . '<br />';
echo 'Total time ' . $profiler->getTotalElapsedSecs() . '<br />';
$count = 0;
$totalTime = 0;
foreach ($profiler->getQueryProfiles() as $query) {
$count++;
$elapsedTime = $query->getElapsedSecs();
$totalTime += $elapsedTime;
echo $count . ' ' . $elapsedTime . ' ' . $query->getQuery() . '<br />';
}
echo 'Sum time: ' . $totalTime . '<br />';
下面是一些结果:
事务Zend_Db_Adapter查询时间:0.23094701767总时间 0.09492349624631 0.00199699401855 连接2 0.000336885452271 开始3 0.000540018081665 INSERT INTO subscribers (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) VALUES (52, 29, 'test_0@gmail.com', 'John', 'Clinton', '2011-01-28 15: 25:21', '2011-01-28 15:25:21')4 0.000504016876221 INSERT INTO subscribers (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) VALUES (52, 29, 'test_1@gmail.com', 'John', 'Clinton', '2011-01-28 15: 25:21', '2011-01-28 15:25:21')
这很奇怪。插入 100 条记录的事务时间是执行所有查询的 2.5 倍。如果我尝试计算在循环中形成字符串的时间,它(如果我们删除查询)不会花费太多时间。
最佳答案
我认为原因之一是您执行 $db->quote() 的次数过多,这是不必要的。你知道吗 $db->quote() 可以接受一个数组作为它的参数,你基本上可以减少对 $db->quote() 的调用到一个。此外,在您的 mysql_query 版本中,您不会转义 $dateAdded 和 $lastChanged,而在 zend_db 版本中,您会转义。
编辑:在下面添加了一个例子
$db = Zend_Db_Table::getDefaultAdapter();
$input = array(
'a' => "asd'lfksd",
'b' => "asdlfk'sdfasdf",
'c' => "asd fds f saf'sdfsd",
'd' => "asd fds f saf'sdfsd"
);
// separate calls to quote
$startTime = microtime(true);
$db->quote($input['a']);
$db->quote($input['b']);
$db->quote($input['c']);
$db->quote($input['d']);
$totalTime1 = microtime(true) - $startTime;
// one call to quote
$startTime = microtime(true);
$db->quote($input);
$totalTime2 = microtime(true) - $startTime;
// show results
var_dump("Sperate calls are ". $totalTime1/$totalTime2 . " times slower");
//output: string 'Sperate calls are 3.0875831485588 times slower' (length=46)
关于php - 为什么 Zend_Db_Adapter 比 mysql_query 慢很多,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4814422/
define('DB_NAME','swiftx'); define('DB_USER','root'); define('DB_PASSWORD','123456'); define('DB_HOS
我有 2 个不同的服务器:一台正在运行的 Plesk Panel(PHP 5.2.13 和 MySQL 5.0.45-community-nt),另一个运行 Zend Server 5.5(PHP 5
我有问题,我想在哈希值相同时进行更新。 哈希在表中是唯一的。我找不到正确的方法来做到这一点。 mysql_query("INSERT INTO shop_product_search3_muokatt
这只是我在 SQL 查询中遇到的一个小问题。它返回一个语法错误,搜索了很长一段时间后,我找不到问题所在。你们谁能找到它吗? 查询: INSERT INTO `blogposts` (id,'autho
我想插入一个表,其中用户 id = 某物并将 o 更改为 1,表示用户在线 试过了 mysql_query("INSERT INTO `20s` VALUES('','','','','','',''
mysql_query php 中的函数返回 TRUE关于成功和FALSE失败时。 我的问题是什么才算是成功? 换句话说,当 SELECT 中没有任何内容时返回什么语句,或者如果有 UPDATE没有匹
我有以下mysql查询 $query = "SELECT id FROM users WHERE... 我想要的是这样的 $query = "SELECT id FROM users WHERE id
Name of company: 包含与数据库的连接,此处不再赘述。连接工作正常,这不是问题。 问题是:php 代码不起作用。 php 代码不会将数据插入我的数据库。怎么了? 最佳答案 在 '
这个问题在这里已经有了答案: Syntax error due to using a reserved word as a table or column name in MySQL (1 个回答)
我有这个 SQL: INSERT INTO v3_peers (torrent, peer_id, ip, ipv6, port, smoke_ip, uplo
我在使用 utf8 编码对数据库运行查询时遇到了一些问题。一切正常,直到我尝试使用带有特殊字符的字符串。我无法对数据库进行大量更改,因为我正在向现有的 prestashop 模板添加一些单独的页面。
我要将一行更新到 mysql 数据库中。 senarius 是:从表单中获取值并重定向到另一个文件,并使用更新语句将表单值设置为数据库。问题是 mysql_query 返回值 1 并且不返回任何错误但
$sql = "UPDATE 'load' SET 'graphe'=".$graphe."','intersection'='".$intersection."','ville'='".$ville
我正在使用动态生成的查询字符串来显示某些报告的搜索表单的结果 - 有 5 个搜索字段,$query2 可以不包含任何内容或包含 5 个额外的搜索值。 $query="SELECT * from emp
我正在使用 PHP 创建类似 twitter 的帖子流。如果用户只想查看他创建的帖子,我应该如何编写 mysql 查询? 这是我现在所拥有的:mysql_query("SELECT * FROMtim
关闭。这个问题是opinion-based 。目前不接受答案。 想要改进这个问题吗?更新问题,以便 editing this post 可以用事实和引文来回答它。 . 已关闭 9 年前。 Improv
这是我的代码 for ($i=0;$i<1000;$i++) { if ($testArray[$i] != 0) { $sql = "insert into `dbT
我已经在 AWS 上使用 Apache、PHP、MYSQL 设置了一个 EC2 Web 服务器,到目前为止,除此之外的所有代码(PHP 和 HTML5)都已在其中运行。我是 PHP 和 mySQL 新
我知道我不应该使用 mysql_query 进行数据库查询,但我需要修改现有代码。我需要做的是将 php 变量作为 sql 查询的字段名称传递。我尝试过这样的方式: $my_field = "fiel
如果我没记错的话,mysql_query()函数使用TCP协议(protocol)发送数据。是否可以重新组装查询 tcp 数据包(例如通过网络发送)并在其他地方重建查询? 我希望下图能更多地解释我的问
我是一名优秀的程序员,十分优秀!