我正在维护一个交通繁忙的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
答案 0 :(得分:0)
通过查看此archive from the old CodeIgniter forum,看起来就像是正常行为。
您可以忽略它。
这是由同一位用户尝试同时在您的网站上加载多个页面(或带有异步AJAX调用的一个页面)引起的。这正是应该发生的事情-等待锁释放(会话在一页上关闭),然后才能获取第二页加载的锁。
并发用户和数据库引擎无关。您没有在MyISAM上看到此消息,只是因为您在该临时切换期间没有具有相同行为的用户。
这基本上是因为CodeIgniter默认使用持久性数据库连接。这是由pconnect
option设置的:
$db['default'] = array(
...
'pconnect' => TRUE,
...
);
由于连接未释放该锁,因此另一个试图加载的页面将等待释放该锁...
您可以尝试禁用持久连接。 This SO answer很好地解释了何时以及为何启用持久连接。