У меня возникла проблема с простым запросом к моей базе данных MySQL с использованием библиотек CodeIgniter3. Я столкнулся с проблемами, обнаружившими узкое место и хотел бы услышать ваши мнения.CodeIgniter3 и results_array() time-out
Технические характеристики:
- РНР 5.4
- CodeIgniter 3.1.2
- MySQL 5.1.73 (через /var/lib/mysql.sock)
Таблица 'Уведомления':
+-------------+--------------+------+-----+------------+----------------+
| 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 съедает все CPU и Nginx время соединения вне с HTTP/1,1 504
- Я попытался войти Mysql_Slow_Queries, ни один не было найдено.
- Таблица используется для хранения InnoDB двигатель (ключ использование буфера ~ 98%)
Пожалуйста, дайте мне знать, что вы думаете, и где я должен искать или, может быть, что именно я должен искать для. Я хотел бы кричать, что это ошибка CodeIgniter, но после протокола, прежде чем я это сделаю, нужно второе мнение.
Заранее спасибо
Вы используете '$ this-> output-> enable_profiler (true)'? – Dan
Нет, я нет. Я предоставил код точно так же, как он используется в приложении. Если необходимо, укажите, почему, и почему запрос без профилировщика вызывает такие проблемы. Спасибо –
Можете ли вы просто использовать запрос 'SELECT id, content, created, seen FROM notification LIMIT 10' и посмотреть, есть ли у вас проблема? Если нет, это означает, что проблема фильтрации может быть проблемой. Попробуйте 'SELECT id, content, created, seen FROM FROM ORDER BY created DESC LIMIT 10'. Если это выглядит хорошо, заказ хорош. Фильтрация может быть проблемой. Попробуйте 'SELECT id, content, created, seen FROM FROM WHERE receiver_id = 1 ORDER BY created DESC LIMIT 10'. Если это нормально, попробуйте выполнить '$ UserID = sprintf ("% d ", $ UserID);' перед '$ sql ...' для преобразования вашего UserID в int. – zedfoxus