我在使用CodeIgniter3库对MySQL数据库进行简单查询时遇到问题。我正面临着找到瓶颈的问题,并希望听到您的意见。
技术规格:
表格'
+-------------+--------------+------+-----+------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+--------------+------+-----+------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| receiver_id | int(11) | NO | MUL | 0 | |
| content | varchar(254) | NO | | NULL | |
| created | varchar(10) | NO | | 1000000000 | |
| seen | set('0','1') | NO | | 0 | |
+-------------+--------------+------+-----+------------+----------------+
5 rows in set (0.01 sec)
从mysql中直接查询:
mysql> select * from notifications order by created desc limit 100;
...
...
100 rows in set (0.01 sec)
使用CodeIgniter查询:
// Load User's Notifications
public function LoadNotifications($UserID)
{
// Load Replies
$sql = "SELECT id, content, created, seen FROM notifications WHERE receiver_id=$UserID ORDER BY created DESC LIMIT 100";
$query = $this->db->query($sql);
if( $query->num_rows() == 0 ) return '0';
$results = $query->result_array();
return $results;
}
我的观察和长时间试图找到原因表明这一行引起了问题:
$results = $query->result_array();
CodeIgniter提供了另一种方法来获取结果作为对象,而不是使用此命令:
$results = $query->result();
正如您可能已经猜到的那样, PHP 使用 HTTP / 1.1 504
来消耗所有CPU和NginX连接超时时得到相同的结果请让我知道您的想法,我应该在哪里寻找,或者我应该寻找什么。我想大声说这是一个CodeIgniter错误,但遵循协议,在我做之前需要第二个意见。
提前致谢
答案 0 :(得分:0)
<强>答案强>
似乎问题根本不在MySQL端,而且证据是我可以在几毫秒内查询任何数量的行。
在function LoadNotifications($UserID)
返回结果后,当CodeIgniter实际呈现返回的$results
数组时,我有一个这样的javascript行:
foreach($results as $notification)
{
echo $notification["content"] . "<br />";
echo "<script> some JS code </script>";
}
问题是由我使用的内联Javascript混淆库CI_Minifier引起的,它导致100个混淆实例同时启动,以混淆我在循环中的那些100 <script>
行。
底线:
如果您使用任何类型的内联PHP DOM解析,例如可以模糊您的代码或将其传递给第三方软件,请确保在返回时不包含该内容结果或渲染代码。
正确的方法是生成您拥有的任何数组的输出,离开该循环,然后管道最终输出以进行模糊处理或在单个实例中执行的任何操作。
感谢@zedfoxus和@Dan帮助我的尝试。
答案 1 :(得分:0)
对于第一个查询,您需要created
上的索引。您可能需要将该列转换为数值数据类型,而不是VARCHAR
。
对于第二个查询,您需要一个不同的索引,即复合INDEX(receiver_id, created)
。您当前的INDEX(receiver_id)
不太好。由于它是我推荐的前缀,我建议你删除你的。