Мне нужен простой способ проверить SQL-запросы для скорости. Я не беспокоюсь об аппаратных отличиях, мне в основном нужно относительное число.
Это то, что я делал с PHP (его нечеткие, но работает):
// CONNECT TO DB HERE $sub = new YomoSubscription(95,783); $t = microtime(TRUE); // contains the SQL db call i'm testing $fp = $sub->generateFingerprint(); echo microtime(TRUE)-$t;
ПРОБЛЕМА, с которой я сталкиваюсь, заключается в том, что иногда при первоначальном подключении / запуске мой тест занимает, например, 1,25 с. Однако при последующих подключениях он занимает 0,004 секунды … Почему это ?
Я уверен, что кеш запросов MySQL отключен в my.ini:
query_cache_size=0
Ваш первый запрос может быть медленнее, потому что MySQL фактически нажимает диск на первый запрос, а не на второй.
Ваша операционная система может кэшировать файлы в памяти по мере их чтения; в результате последующие чтения могут не понадобиться на самом деле попадать на диск и возвращаться намного быстрее.
Как правило, я обычно запускаю запрос несколько раз и ищут согласованность. Чаще всего первый прогон займет несколько раз дольше, а 2-й и 4-й занимает примерно столько же времени. Эти последующие прогоны, вероятно, более характерны для производительности, которую вы увидите в реальной производственной системе, поскольку ваша производственная база данных должна хранить эти данные в кэше ОС, в то время как ваша система-разработчик редко обращается к ней.
В конце концов, когда дело доходит до производительности запросов, по большей части вы должны просто дать ему быстрый проход в разработке и контролировать журнал медленных запросов в процессе производства, чтобы увидеть, какие запросы действительно нужны.
Что касается программных запусков запросов для данных о производительности – возьмите несколько образцов и используйте медианную. Но на практике это не будет ужасно репрезентативным для фактических проблем с производительностью, с которыми вы столкнетесь в процессе производства.
Попробуйте использовать SELECT BENCHMARK (время, запрос)
Дополнительная информация: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_benchmark
Предположим, что:
Если вы действительно хотите проверить свой запрос, вы должны сделать следующее:
$database->query('SET SESSION query_cache_type = OFF');
Затем вы запускаете запрос 2-3 раза в цикле (для «разогрева» сервера).
И только тогда:
$database->query('FLUSH STATUS'); #If you use the stats to profile your query $t = microtime(TRUE); $fp = $sub->generateFingerprint(); echo microtime(TRUE)-$t; $database->query('SHOW STATUS');
И вуаля!! :)))
BTW, скорость запроса – один из параметров для чтения. Узнайте, как читать очень ценную информацию, возвращенную SHOW STATUS
и EXPLAIN ...
Это будет намного лучше.
Вот ссылка, которую вы полюбите: http://www.xaprb.com/blog/2006/10/12/how-to-profile-a-query-in-mysql/
Наслаждаться. 🙂
Возможно, вы используете устойчивые соединения в своем классе. Pconnect будет повторно использовать соединение и будет учитывать этот тип задержки.