mysql慢查询中的Codeigniter会话查询
Posted
技术标签:
【中文标题】mysql慢查询中的Codeigniter会话查询【英文标题】:Codeigniter session query in mysql slow query 【发布时间】:2019-09-01 04:16:03 【问题描述】:我正在维护一个使用 codeigniter 和 mysql 提供 RESTFul API 的大流量 Web 应用程序。 开启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】:通过查看这个archive from the old CodeIgniter forum,它看起来很正常。
你可以忽略这个。
这是由同一用户尝试在您的网站上同时加载多个页面(或一个具有异步 AJAX 调用的页面)引起的。这正是应该发生的事情 - 等待锁定被释放(会话在一个页面上关闭),然后才能获得第二个页面加载的锁定。
并发用户和数据库引擎无关。您没有在 MyISAM 上看到这一点,只是因为您在临时切换期间没有具有相同行为的用户。
这基本上是因为 CodeIgniter 默认使用持久数据库连接。这是由pconnect
option设置的:
$db['default'] = array(
...
'pconnect' => TRUE,
...
);
由于连接没有释放锁,所以另一个试图加载的页面将等待锁被释放...
您可以尝试禁用持久连接。 This SO answer 很好地解释了何时以及为何启用持久连接。
【讨论】:
我想知道...是 CogeIgniter 没有清除GETLOCKs
的错吗?还是 CI 使用了某种连接轮询机制,而 那个 有问题?
即使 CodeIgniter 正在清除它的锁(看起来确实如此),如果用户同时加载 2 个页面,仍然有可能一个页面会被锁定......但是,看看 OP查询日志,我想知道什么会真正导致 100 秒的延迟..
'pconnect' => false,但是 set_lock 的一些查询仍然处于睡眠模式?谁能告诉我为什么???谢谢
是的,这发生了几个“获取”请求(就像 AJAX 调用 @Indigo 提到的那样。以上是关于mysql慢查询中的Codeigniter会话查询的主要内容,如果未能解决你的问题,请参考以下文章
Codeigniter 数据库错误:1064 使用 MySQL 可能还有一些会话配置错误
使用 PHP/CodeIgniter 在 MySQL 中获取最后执行的查询