Страницы

Поиск по вопросам

воскресенье, 7 июля 2019 г.

Постоянное соединение с базой MySQL

Из-за повторных соединений с базой возникает существенная нагрузка на сервер MySQL, на эти операции приходится 64% от общей нагрузки, неизбежно приходиться смотреть в сторону постоянного подключения, подскажите как лучше это сделать? PDO или Myqli? Сейчас сайт сверстан на PDO. Читал в интернете, что при постоянном соединений не рекомендуется PDO. С радостью приму также дополнительные советы.
Вот статистика нагрузки на базу:


Ответ

Сначала, ссылка, просто прочитайте всё там - минут 10, зато многие вопросы сами собой отпадут.
Не понимаю, откуда взялась эта дурацкая легенда о том, что нужно обязательно "закрывать" соединение? Может так и было в php версии 4 и ниже, на устаревшем ныне расширении mysql, но в PDO совершенно точно это не так. Вот просто реально, все кто про это пишет - зайдите и еще раз внимательно прочитайте
При успешном подключении к базе данных в скрипт будет возвращен созданный PDO объект. Соединение остается активным на протяжении всего времени жизни объекта. Чтобы закрыть соединение, необходимо уничтожить объект путем удаления всех ссылок на него (этого можно добиться, присваивая NULL всем переменным, указывающим на объект). Если не сделать этого явно, PHP автоматически закроет соединение по окончании работы скрипта.
Как правильно пишут товарищи в комментариях - по-хорошему, за выполнение скрипта соединение должно создаваться один лишь раз. Как вы это реализуете - без разницы: можно использовать глобальную переменную, можно использовать статическую переменную функции, можно использовать статический метод класса (со статической переменной класса). Все кто пишут просто "статические методы - плохо", это, конечно, гениально, повторять за большинством, но я реально не вижу ни одной разумной причины, по которой, например, для каждого объекта люди почему-то создают новое соединение. И уж совершенно точно не нужно на каждый запрос открывать отдельное соединение. Раз уж у вас есть PDO - используйте его возможности на максимум:
а. используйте подготовленные запросы и никогда не вклеивайте переменные вручную в строку запроса.
б. где нужно именно выполнить несколько запросов в цикле - делаете PDO::prepare перед циклом, записываете в переменную, далее в цикле уже выполняете PDOStatement::execute и PDOStatement::fetchAll. Но всё же в большинстве случаев рекомендую подумать - а нельзя ли все необходимые данные вытянуть, всё же, одним запросом.
в. ознакомьтесь с константами PDO::FETCH_*. чаще всего необходимы:
PDO::FETCH_ASSOC - почти всегда (рекомендуется его вообще прописать в опциях соединения, как режим извлечения по-умолчанию) PDO::FETCH_COLUMN - когда нужно получить массив, в котором собраны все значения лишь по одному из столбцов в бд PDO::FETCH_KEY_PAIR - ключ - первое поле выборки, значение - второе поле выборки (например массив [ id_клиента => имя_клиента ]). PDO::FETCH_UNIQUE | PDO::FETCH_ASSOC - когда нужно получить массив, ключом которого станет первое поле из выборки, а значением - массив данных. PDO::FETCH_GROUP | PDO::FETCH_ASSOC - вообще чудеснейшая комбинация, по первому полю выборка группируется и раскладывается на отдельные "подмассивы".
P.S. ну и, не относится напрямую к PDO, не забывайте про ключи и предподготовку статистических данных (судя по тому, что у Вас всего три апдейта за сутки - это должно сократить время выборок в разы).

Комментариев нет:

Отправить комментарий