Насколько дорого обходится операция подключения к базе данных Mysql?

В некоторых функциях кода php будет выполнять сотни, а в некоторых случаях и тысячи запросов к одним и тем же таблицам, используя цикл. В настоящее время он создает новое соединение с базой данных для каждого запроса. Насколько дорогая эта операция? Увижу ли я значительное увеличение скорости при повторном использовании того же соединения? Чтобы изменить это поведение и использовать ту же базу данных, может потребоваться небольшой рефакторинг.

PHP использует mysql_connect для подключения к базе данных.

Основываясь только на том, что я сказал здесь, есть ли другие очевидные оптимизации, которые вы бы порекомендовали (например, я читал о блокировке таблиц...)?

РЕДАКТИРОВАТЬ: Мой вопрос больше о пользе использования одного соединения, а не о том, как избежать использования более одного.


person matzahboy    schedule 09.06.2011    source источник
comment
Что произошло, когда вы проверили это?   -  person symcbean    schedule 09.06.2011
comment
Существует хорошая документация по адресу: dba.stackexchange.com/questions/16969/   -  person Alireza Fattahi    schedule 07.12.2014


Ответы (3)


В документации для mysql_connect указано:

Если сделать второй вызов mysql_connect() с теми же аргументами, новая ссылка не будет установлена, но вместо этого будет возвращен идентификатор уже открытой ссылки.

Таким образом, если вы не подключаетесь с другими учетными данными, изменение этой части вашего кода не повлияет на производительность.

person Sonny    schedule 09.06.2011
comment
Если только он не звонит mysql_close() после каждого запроса. - person Frank Farmer; 09.06.2011
comment
Я не понимал, что mysql_connect не создает несколько соединений. Спасибо - person matzahboy; 11.06.2011

Я использую Zend_Framework, и профилирование моей базы данных показывает, что само соединение занимает почти в 10 раз больше времени, чем большинство моих запросов. У меня есть две разные базы данных, к которым я подключаюсь, и только один раз подключаюсь к каждой для каждого запроса.

Я бы сказал, что повторное подключение для каждого запроса — плохой дизайн, но вопрос рефакторинга более сложен. Вопросы, которые необходимо задать:

  1. Есть ли текущие проблемы с производительностью?
  2. Выполняли ли вы профилирование кода, чтобы сузить круг проблем с производительностью?
  3. Сколько времени потребуется на этот рефакторинг? Примите во внимание участие в тестировании, а не только время написания кода.
person Sonny    schedule 09.06.2011
comment
Имеются текущие проблемы с производительностью. Я не делал профилирование кода. Я не знаю, сколько времени займет рефакторинг, так как я не знаком с кодовой базой на 100%. - person matzahboy; 09.06.2011
comment
Похоже, это хороший кандидат на рефакторинг! Однако повторюсь: профилирование кода должно быть важным фактором при определении приоритетов рефакторинга. - person Sonny; 09.06.2011
comment
Я получил отрицательный голос на этом. Было бы неплохо, если бы избиратель оставил комментарий о том, почему. - person Sonny; 09.06.2011

Ответ на исходный вопрос должен быть очевиден. Если это не очевидно для вас, тогда должно быть очевидно, как узнать для себя, какое влияние это оказывает.

есть ли другие очевидные оптимизации

Нет, потому что вы не предоставили никаких подробностей ни о структуре таблицы, ни о выполняемых вами запросах.

person symcbean    schedule 09.06.2011