bearbeiten basierend auf Kommentare von spencer7593 und Martin:
Eine einfache Zählung + select-Abfrage könnte viel schneller als ein SQL_CALC_FOUND_ROWS sein. siehe: Which is fastest? SELECT SQL_CALC_FOUND_ROWS FROM `table`, or SELECT COUNT(*)
Ich schlage vor, sowohl Ihre ursprüngliche Abfrage und:
SELECT count(*)
FROM `logs`
WHERE `connect_timestamp` > 10000
Plus:
SELECT `a`
FROM `logs`
WHERE `connect_timestamp` > 10000
ORDER BY `connect_timestamp` DESC
LIMIT 1
Beste sogar zu laufen alle mit EXPLAIN hinzugefügt zu messen (und fügen) die Laufzeiten und Wenn Sie den Unterschied sehen, können Sie auch SQL_NO_CACHE hinzufügen, um einen ersten Lauf zu simulieren. siehe: https://www.percona.com/blog/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/
Wenn das überhaupt nicht helfen, ich schlage vor, schauen in die folgenden:
Dinge können Sie versuchen:
- Index der Spalte, die für die Suche verwendet wird (Sie scheinen haben bereits getan)
- Machen Sie eine Ansicht für bestimmte Abfragen, die oft ausgeführt werden sollen.
- Versuchen Sie die spezifische Tabelle zwischenzuspeichern, wenn der Server über Speicher verfügt.
- Auch wie Martin sagte in den Kommentaren, setzen Sie EXPLAIN vor der Abfrage, um zu sehen, welcher Teil der Abfrage die ganze Zeit dauert. Vielleicht kannst du etwas daran ändern.
Das sind die Dinge, die ich mir vorstellen kann.
Was ist ein "normaler" Index? – Martin
Sie möchten einen Index für die Spalte 'connect_timestamp' haben. – Martin
Und verwenden Sie 'EXPLAIN', um Ihnen zu helfen, die SQL zu erklären – Martin