Запрос сеанса Codeigniter в MySQL медленный запрос - PullRequest
1 голос
/ 10 апреля 2019

Я поддерживаю веб-приложение с интенсивным трафиком, предоставляющее RESTFul API с использованием codeigniter и mysql. После включения mysql медленного журнала запросов с длительностью запроса 1 секунда следующий запрос повторяется при повторном входе со временем выполнения более 100 секунд.

SELECT GET_LOCK('fhn1enbb1u9hgu4m1tq32fbsds4c8ohj', 300) AS ci_session_lock;

Похоже, что-то с настройкой codeigniter, пожалуйста, помогите.

Пример журнала медленных запросов:

SET timestamp=1554912062;
SELECT GET_LOCK('fhn1enbb1u9hgu4m1tq32fbsds4c8ohj', 300) AS ci_session_lock;
Time: 2019-04-10T16:01:02.640796Z
Query_time: 99.819745  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0

SET timestamp=1554912062;
SELECT GET_LOCK('taff1quqs4gv2g33740t41cdplnpkof8', 300) AS ci_session_lock;
Time: 2019-04-10T16:01:03.082128Z
Query_time: 94.859307  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0

SET timestamp=1554912061;
SELECT GET_LOCK('fhn1enbb1u9hgu4m1tq32fbsds4c8ohj', 300) AS ci_session_lock;
Time: 2019-04-10T16:01:01.979967Z
Query_time: 106.766586  Lock_time: 0.000000 Rows_sent: 1  Rows_examined: 0

1 Ответ

0 голосов
/ 10 апреля 2019

Глядя на этот архив со старого форума CodeIgniter , он выглядит как нормальное поведение.

Вы можете просто проигнорировать это.

Это вызваноодин и тот же пользователь пытается одновременно загрузить несколько страниц (или одну страницу с асинхронными вызовами AJAX) на ваш сайт.И это именно то, что должно произойти - дождитесь освобождения блокировки (сеанс закрыт на одной странице), прежде чем сможете получить блокировку для загрузки второй страницы.

Параллельные пользователи и ядро ​​базы данных не имеют значения,Вы не видели этого на MyISAM только потому, что у вас не было пользователя с таким же поведением во время этого временного переключения.

Это в основном потому, что CodeIgniter по умолчанию использует постоянное соединение с базой данных.Это устанавливается параметром pconnect :

$db['default'] = array(
    ...
    'pconnect' => TRUE,
    ...
);

Поскольку блокировка не снимается соединением, другая страница, пытающаяся загрузить, будет ожидать освобождения блокировки ...

Вы можете попытаться отключить постоянное соединение. Этот SO-ответ дает довольно хорошее объяснение того, когда и почему разрешено постоянное соединение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...