我正在维护一个繁重的流量Web应用程序,使用codeigniter和mysql提供RESTFul API。转换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
通过观察这个archive from the old CodeIgniter forum,它看起来像正常的行为。
你可以忽略这一点。
这是由同一用户试图在您的网站上同时加载多个页面(或一个带异步AJAX调用的页面)引起的。它正是应该发生的事情 - 等待锁定被释放(会话在一个页面上关闭),然后才能获得第二页加载的锁定。
并发用户和数据库引擎无关紧要。您没有在MyISAM上看到这个,只是因为您在临时切换期间没有具有相同行为的用户。
这基本上是因为CodeIgniter默认使用持久数据库连接。这是由pconnect
option设定的:
$db['default'] = array(
...
'pconnect' => TRUE,
...
);
由于连接未释放锁定,因此另一个尝试加载的页面将等待释放锁定...
您可以尝试禁用持久连接。 This SO answer对启用持久连接的时间和原因提供了很好的解释。