Ich habe ein Problem mit einer einfachen Abfrage zu meiner MySQL-Datenbank mit den CodeIgniter3-Bibliotheken. Ich stehe vor dem Problem, den Engpass zu finden und würde gerne Ihre Meinung hören.CodeIgniter3 und result_array() Zeitüberschreitung
Technische Daten:
- PHP 5.4
- CodeIgniter 3.1.2
- MySQL 5.1.73 (via /var/lib/mysql.sock)
Tabelle "Benachrichtigungen":
+-------------+--------------+------+-----+------------+----------------+
| 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)
direkte Abfrage aus mysql:
mysql> select * from notifications order by created desc limit 100;
...
...
100 rows in set (0.01 sec)
Abfrage mit 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;
}
Meine Beobachtungen und lange Zeit versucht, einen Grund zu finden, ergab, dass diese Linie Ursachen das Problem:
$results = $query->result_array();
CodeIgniter bietet eine weitere Möglichkeit, die Ergebnisse als ein Objekt zu erhalten, anstatt mit diesem Befehl ist:
$results = $query->result();
Wie Sie vielleicht schon erraten haben, ich das gleiche Ergebnis mit PHP bekommen alle CPU essen und nginx Verbindung Ablaufen mit einem HTTP/1,1 504
- ich versucht habe Mysql_Slow_Queries einzuloggen, wurden keine gefunden.
- Tabelle verwendet InnoDB (Schlüsselpuffer Verwendung ~ 98%)
Bitte lassen Sie mich wissen, was Sie denken, und wo soll ich oder vielleicht suchen, was genau soll ich suchen werden zum. Ich würde gerne sagen, dass dies ein CodeIgniter-Fehler ist, aber nach dem Protokoll, eine zweite Meinung ist erforderlich, bevor ich es tue.
Vielen Dank im Voraus
Verwenden Sie '$ this-> output-> enable_profiler (true)'? – Dan
Nein, bin ich nicht. Ich habe den Code genau so bereitgestellt, wie er in der Anwendung verwendet wird. Geben Sie bei Bedarf bitte an, warum und warum eine Abfrage ohne den Profiler solche Probleme verursacht. Danke –
Können Sie nur die Abfrage verwenden 'SELECT ID, Inhalt, erstellt, gesehen von Benachrichtigungen LIMIT 10' und sehen, ob Sie ein Problem haben? Wenn nicht, bedeutet das, dass die Filterung angeordnet sein könnte. Versuchen Sie 'SELECT ID, Inhalt, erstellt, gesehen von Benachrichtigungen ORDER BY erstellt DESC LIMIT 10'. Wenn das gut aussieht, ist die Bestellung gut. Filterung könnte ein Problem sein. Versuchen Sie 'SELECT ID, Inhalt, erstellt, gesehen von Benachrichtigungen WHERE receiver_id = 1 ORDER BY erstellt DESC LIMIT 10'. Wenn das in Ordnung ist, versuchen Sie '$ UserID = sprintf ("% d ", $ UserID);' vor '$ sql ...' um Ihre UserID in einen int zu konvertieren. – zedfoxus