在mysql慢查询中的Codeigniter会话查询

问题描述 投票:1回答:1

我正在维护一个繁重的流量Web应用程序,使用codeigniter和mysql提供RESTFul API。转换mysql慢查询日志后,查询时间为1秒,查询重复登录,执行时间为100+秒。

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

似乎有cod​​eigniter配置的东西请帮忙。

Sample slow query log:

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
php mysql performance codeigniter mysql-slow-query-log
1个回答
0
投票

通过观察这个archive from the old CodeIgniter forum,它看起来像正常的行为。

你可以忽略这一点。

这是由同一用户试图在您的网站上同时加载多个页面(或一个带异步AJAX调用的页面)引起的。它正是应该发生的事情 - 等待锁定被释放(会话在一个页面上关闭),然后才能获得第二页加载的锁定。

并发用户和数据库引擎无关紧要。您没有在MyISAM上看到这个,只是因为您在临时切换期间没有具有相同行为的用户。

这基本上是因为CodeIgniter默认使用持久数据库连接。这是由pconnect option设定的:

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

由于连接未释放锁定,因此另一个尝试加载的页面将等待释放锁定...

您可以尝试禁用持久连接。 This SO answer对启用持久连接的时间和原因提供了很好的解释。

© www.soinside.com 2019 - 2024. All rights reserved.