2016-03-31 9 views
0

Ich habe eine MySQL (InnoDB) -Tabelle, in der ich eine große Anzahl von Zeilen (ein paar Millionen) habe. Ich mache Anfragen als solche:Vergleich der TIMESTAMP-Spalte für große Tabelle

SELECT SQL_CALC_FOUND_ROWS `a` 
FROM `logs` 
WHERE `connect_timestamp` > 10000 
ORDER BY `connect_timestamp` DESC 
LIMIT 1 

Ich habe einen normalen Index auf die Säule gegeben, aber eine Abfrage wie dies dauert bis zu 20 Sekunden, gibt es einen besseren Weg?

+0

Was ist ein "normaler" Index? – Martin

+0

Sie möchten einen Index für die Spalte 'connect_timestamp' haben. – Martin

+0

Und verwenden Sie 'EXPLAIN', um Ihnen zu helfen, die SQL zu erklären – Martin

Antwort

1

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.

+1

ist nicht die 'a' eine Spalte, die von' select' aufgerufen wird? – Martin

+0

wenn nicht, dann wäre sicher ein "COUNT" SQL besser als das aktuelle SQL von OPs? – Martin

+0

Oh, mein Schlechter :) umbenennen die ausgewählte Variable in diesem Fall, aber umbenennen das Ergebnis wird definitiv nicht die Abfrage nach unten, denke ich. Ich werde es entfernen, danke! – Jester

0
INDEX(connect_timestamp, a) 

Dies wird eine „Abdeckung“ Index, werden, wodurch die SQL_CALC_FOUND_ROWS sowie die SELECT ... LIMIT 1 beschleunigen.

Es muss vom Ende des Index bis 10000 zurück scannen. Wie viele Zeilen ist das?

Wenn connect_timestamp sind einige Arten von CHAR statt irgendeine Art von INT, dann haben Sie anderes Problem. Bitte geben SieSHOW CREATE TABLE.