MySQL中的Codeigniter会话查询慢查询

时间:2019-04-10 16:10:56

标签: php mysql performance codeigniter mysql-slow-query-log

我正在维护一个交通繁忙的Web应用程序,该应用程序使用codeigniter和mysql提供RESTFul API。 在查询后以1秒长的查询时间打开mysql慢查询日志后,以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 :(得分:0)

通过查看此archive from the old CodeIgniter forum,看起来就像是正常行为。

  

您可以忽略它。

     

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

     

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

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

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

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

您可以尝试禁用持久连接。 This SO answer很好地解释了何时以及为何启用持久连接。