Насколько интенсивно ЦП открывает и закрывает соединение с БД (для веб-приложения) в MySQL
- ... когда программное обеспечение БД находится на localhost?
- ... когда программное обеспечение БД находится на другом компьютере?
источник
Насколько интенсивно ЦП открывает и закрывает соединение с БД (для веб-приложения) в MySQL
Подумайте об объеме памяти, выделяемой на соединение с БД. Какие вещи должны быть выделены? Согласно Руководству по изучению сертификации MySQL 5.0, стр. 357 :
Сервер поддерживает несколько буферов для каждого клиентского соединения. Один используется в качестве буфера связи для обмена информацией с клиентом. Для каждого клиента поддерживаются другие буферы для чтения таблиц и выполнения операций объединения и сортировки.
Какие параметры определяют буферы для каждого соединения?
Требуется время, чтобы выделить и освободить эти буферы, когда возникает соединение. Не забудьте умножить сумму этих значений на max_connections . В качестве примечания, пожалуйста, воздержитесь от использования mysql_pconnect, так как постоянные соединения MySQL плохо ладят. Вот две информативные ссылки на эту тему:
В среде с интенсивным чтением и интенсивной записью, такой как OLTP, это будет дорого с точки зрения использования ОЗУ и возможного запрета из-за перестановки в ОС. На сайте с низким уровнем записи и низким уровнем чтения я бы не стал так сильно волноваться.
Я не уверен, что это имеет значение «насколько дороже». Это, безусловно, дороже, чем повторное использование одного и того же соединения. То, что вы увидите, будет зависеть от того, правильно ли вы используете пул соединений, насколько насыщен ваш пул, доступные ресурсы на коробке и т. Д.
В общем, если вы выполняете цикл для некоторого взаимодействия с базой данных, вам будет гораздо лучше повторно использовать то же активное соединение, чем открывать и закрывать внутри цикла (анти-паттерн, который я вижу довольно часто) ,
Дилемму между повторным использованием объекта и его сносом и созданием его снова (оба из которых имеют свои преимущества и недостатки) часто можно решить с помощью компромисса: кэшировать объект, но в течение ограниченного времени (то есть с истечением срока действия). Если к объекту часто обращаются, то он продолжает использоваться повторно. Но если он не используется в течение некоторого времени, то механизм истечения удаляет его, заставляя его воссоздать, когда это будет необходимо еще раз.
Система может иметь глобальный хук для такого рода кэшей, который вызывается при нехватке памяти, что приводит к тому, что все они отбрасывают недавно неиспользуемые объекты.
Mysql кэширует соединения (или потоки), используя кэш потоков (thread_cache_size). Максимальное значение для него - 100. Когда клиент закрывает соединение, оно возвращается в кеш. Когда открывается новое соединение, оно проверяет кэш потока. На очень загруженной системе открытие закрывающего соединения может дорого обойтись, особенно если у вас долго выполняются запросы.
https://dev.mysql.com/doc/refman/5.6/en/connection-threads.html Если вы можете позволить себе Mysql Enterprise, вы можете использовать плагин Thread Pool, реализованный в Mysql 5.6.