Chris82: SELECT-Abfrage bei MySQL-Tabelle dauert zu lange

Hi Leutz,

ich habe eine MySQL-Tabelle, welche sehr grosse Datenmengen im siebenstelligen Bereich beinhaltet. Diese Tabelle hat folgende Struktur:

CREATE TABLE IF NOT EXISTS hisdata (
  ID bigint(10) NOT NULL AUTO_INCREMENT,
  CURRENCY varchar(10) NOT NULL,
  TIMESTAMP bigint(30) NOT NULL,
  BID double NOT NULL,
  ASK double NOT NULL,
  PRIMARY KEY (ID),
  KEY index\_ts (TIMESTAMP),
  KEY index\_curr (CURRENCY),
  KEY TIMESTAMP (TIMESTAMP),
  KEY CURRENCY (CURRENCY)
) ENGINE=MyISAM  DEFAULT CHARSET=latin1 AUTO_INCREMENT=6559667 ;

Wenn ich auf diese Tabelle nun eine SELECT-Abfrage wie:

SELECT * FROM hisdata WHERE CURRENCY = 'EURUSD' AND TIMESTAMP >= 633 347424000000000 AND TIMESTAMP <= 633398400000000000 ORDER BY TIMESTAMP ASC LIMIT 0,100000

ausführe, dauert das extrem lange. Für 100000 Datensätze braucht er ca. 10 Sekunden. Das muss deutlich schneller gehen. Ich habe, wie bereits zu sehen ist, Indizes auf die Spalten CURRENCY und TIMESTAMP gesetzt, da nach den Werten dieser Spalten auch gesucht wird. Leider hat das zu vorher auch keine grossen Performance-Verbesserungen gebracht. Hat jemand von Euch eine Idee, wie man die Performance hier steigern kann? Bin für jeden Tip dankbar.

Gruß,
Chris

  1. Hi!

    Wenn ich auf diese Tabelle nun eine SELECT-Abfrage wie: [...] ausführe, dauert das extrem lange.
    Ich habe, wie bereits zu sehen ist, Indizes auf die Spalten CURRENCY und TIMESTAMP gesetzt, da nach den Werten dieser Spalten auch gesucht wird.

    Was sagt EXPLAIN?

    SELECT * FROM hisdata WHERE CURRENCY = 'EURUSD' AND TIMESTAMP >= 633 347424000000000 AND TIMESTAMP <= 633398400000000000 ORDER BY TIMESTAMP ASC LIMIT 0,100000

    Wie startest du die Abfrage? Nimmst du eine gepufferte oder ungepufferte Query?

    Zusatzfrage: Warum sind deine Timestamps in einem dermaßen großen Bereich? Selbst wenn ich Millisekunden annehme, komme ich auf circa 20 Millionen Jahre. Bist du sicher, dass du dann so eine hohe Auflösung benötigst?

    Lo!

  2. moin,

    ausführe, dauert das extrem lange. Für 100000 Datensätze braucht er ca. 10 Sekunden. Das muss deutlich schneller gehen.

    wenn du 100.000 datensätze ausgibst, gibt es zwei relevante zeiten. einmal wielange das dbms braucht, um die daten zur verfügung zu stellen, zum anderen wie lange es dauert, bis sie beim client ankommen. das ist gerade bei netzwerken interessant.

    Ich habe, wie bereits zu sehen ist, Indizes auf die Spalten CURRENCY und TIMESTAMP gesetzt, da nach den Werten dieser Spalten auch gesucht wird.

    ein index ist kein allheilmittel. es gibt eine faustregel, wenn du mehr als 10% der daten einer tabelle selektierst, dann bringt dir ein index auch nicht viel. zum anderen würde ich es mal mit einem zusammengesetzten index der spalten CURRENCY und TIMESTAMP versuchen.

    Ilja