저는 프로젝트에서 Zend Framework를 사용합니다. 나는 여러 레코드를 삽입해야하고 Zend_Db가 놀랍게도 느린 그 my_sql 쿼리 (여러 번)를 발견했기 때문에 내가 잘못 생각했다고 생각했습니다. 두 가지 예가 있습니다.Zend_Db_Adapter가 mysql_query보다 훨씬 느린 이유
Zend_Db_Adapter :와는 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 . ', ' . $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;
예 : 첫 번째 경우
$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;
IT는 3.7 초, 14.8 초 걸렸다. 왜 그런 일이 일어나고 무엇이 잘못 되었습니까? 내가 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;
이 문제에 대한 정보 주셔서 감사합니다. Zend_Db_Adapter의 벤치 마크와
$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();
코드 (나는이 경우에도 따옴표를 사용하지 않은) : 여기
$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 />';
어떤 결과입니다
이 코드는 mysql_query 약 0.065 초 정도 걸립니다 :
트랜잭션 시간 Zend_Db_Adapter 쿼리 : 0.23094701767 총 시간 0.0949234962463 1 0.00199699401855 2 0.000336885452271 시작 3 0.000540018081665 INSERT INTO 가입자 (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) VALUES (52, 29, '[email protected]', 'John', 'Clinton' 01-28 15:25:21 ','2011-01-28 15:25:21 ') 4 0.000504016876221 INSERT INTO 가입자 (list_id, account_id, email_address, first_name, last_name, date_added, last_changed) VALUES (52, 29, '[email protected]', 'John', 'Clinton', '2011-01-28 15:25:21', '2011-01-28 15:25:21')
매우 이상합니다. 모든 레코드를 삽입하기위한 트랜잭션의 시간은 모든 쿼리를 실행하는 것보다 2.5 배 더 큽니다. 루프에서 문자열을 형성하는 시간을 측정하려고하면 쿼리를 삭제할 때 시간이 많이 걸리지 않습니다.
많은 양의 데이터가있는 큰 시스템을 사용하는 경우 doctrine2를 ORM – Tjorriemorrie
으로 간주 할 수 있습니다. 예, 데이터가 많습니다. 그러나 Zend_Db_Adapter 문제는 아직 명확하지 않습니다. 왜 그렇게 오래 걸릴지 모릅니다. – Oleg