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会话查询的主要内容,如果未能解决你的问题,请参考以下文章

MySQL中的慢子查询

MySQL数据库的备份还原以及mysqldump的使用

Codeigniter 数据库错误:1064 使用 MySQL 可能还有一些会话配置错误

使用 PHP/CodeIgniter 在 MySQL 中获取最后执行的查询

phpMyAdmin中的慢查询但Mysql慢查询日志文件中没有[关闭]

MySQL中慢查询日志