2012-04-23 2 views
0

Я пытаюсь написать php benchmark, чтобы сравнить некоторые СУБД, NewSQL и NoSQL. Этот сценарий просто выполняет запросы и измеряет время выполнения.mysql_query, эквивалентный mongoDB

Для MySQL-как, я просто использую:

$start = microtime(true); 
$result = mysql_query($SQL); 
$end = microtime(true); 

Я не получить данные для моего теста.

Но с MongoDB-PHP, функция find() возвращают cursor

$start = microtime(true); 
$collection = $this->_db->selectCollection($collection); 
$cursor = $collection->find($query); 
$end = microtime(true); 

ли $cursor и $result являются эквивалент (затраты времени/данные)? Курсор не загружает данные, я должен перебирать курсор для загрузки данных. Поэтому время для выполнения запроса между MySQL и mongoDB настолько отличается или просто скачками mongoDB ...

Мне интересно, будет ли это более справедливо чтобы изменить код:

$start = microtime(true); 
$result = mysql_query($SQL); 
while ($row = mysql_fetch_row($result)) {} 
$end = microtime(true); 

и

$start = microtime(true); 
$cursor = $collection->find($query); 
foreach ($cursor as $doc) {} 
$end = microtime(true); 

и, наконец, это правда, сказать, что каждый раз, когда вы итерацию по MongoDB данных курсора получать непосредственно из MongoDB-сервера, а не из памяти компьютера?

ответ

0

Запуск -> find() действительно просто возвращает курсор. Запрос не выполняется, пока вы не получите первый результат. В этот момент драйвер выдаст запрос. Это позволяет вам изменять курсор с помощью таких вещей, как -> limit() и -> skip(). Так что да, было бы справедливо итератировать по набору результатов.

И да, повторяя курсор mongoDb, данные извлекаются с сервера MongoDB. Нет небуферизованных запросов, таких как MySQL (что позволяет и то, и другое). Конечно, MongoDB также будет иметь эти данные в памяти, особенно если вы делаете это два раза сразу после друг друга.

+0

Хорошо, спасибо, что ты прав. Но как вы думаете, что я делаю хорошо? Или есть другое решение, о котором я не думал? Пример: использовать MongoDB :: выполнить? – Kakawait

+0

Выполнение не предназначено для запуска запросов, просто для запуска произвольного javascript. Мне никогда не приходилось это использовать. Лучшее для бенчмаркинга будет иметь реальное приложение или, возможно, тестирование вставки. – Derick

+0

Да, для моего примера я выбрал select query. Но мой тест выполнит много разных типов запросов (select, insert, update и т. Д.) На псевдо-реальном приложении. Но моя проблема - это просто выбор, потому что mongodb использует курсор. – Kakawait

Смежные вопросы