Select-Statement optimieren

I

IchHabeEineFr

Gast
Hallo,

habe mal ne Frage an die Datenbank-Spezis:

Ich habe ein Query auf einer Datenbank (MySQL) welches ich gerne optimieren würde (Tabellen-Struktur kann ich nicht ändern).

SQL:
select * from [table] where [field1] in ('wert1', 'wert2', '....', 'wert20')  AND [field2] > 'Datum'  order by [field3] ASC, [field4] ASC, [field5] DESC, [field6] DESC limit 10;
field1 = Varchar(25)
field2 = Datetime
field3 = Varchar(25)
field4 = Varchar(25)
field5 = Varchar(25)
field6 = timestamp

Die Tabelle hat > 2 Mllionen Datensätze und das Ganze dauert ewig. Ich habe jetzt auf field1 einen Index gelegt, dadurch wurde es etwas schneller, aber nicht schnell genug. Gibt es sonst etwas was ich tun kann um so ein Statement zu optmieren. Indexe auf field2 oder die "order"-Fields brachten nicht.
 

c_sidi90

Top Contributor
Mehr als 2 Mill Datensätze in ein ResultSet, da wirste mit Optimierung deines Statements auch nicht auf wesentlich mehr Geschwindigkeit kommen. Sinnvoller ist da, dir ein Konzept zu überlegen, wie und WANN du die Daten lädst. Stichwort "Lazyloading". Wenn du zB Daten in einer Tabelle darstellen möchtest, macht es ja auch keinen Sinn alle aufeinmal darzustellen, was soll ein User durch eine 2Millionen große Tabelle scrollen.
 

tfa

Top Contributor
Wenn die Tabelle so groß oder das Statement so aufwendig ist, dass die DB erstmal Minuten braucht, bis ein Cursor da ist, über den du die Daten lesen kannst, nützt dir Lazy Loading auch nichts. Egal ob da jetzt 2 Millionen oder 20 Zeilen bei raus kommen. Und diese Query ist ja schon auf 10 begrenzt.
 
I

IchHabeEineFr

Gast
Wie tfa schon sagt, nutze ich breits "pagging" via limit, das Problem ist einfach die viel "String" vergleiche in der DB (zum Suchen und Sortieren), denke ich.
 
T

Tomate_Salat

Gast
Habe noch nicht viel mit DB-Optimierung gemacht, aber ich würde hier einen Index auf [field2,field1] (also einen Index auf beide in dieser Reihenfolge) setzen.
 

c_sidi90

Top Contributor
Hast du den Sort-Buffer mal erhöht? Das kann sich auch positiv in der Geschwindigkeit bei der Sortierung bemerkbar machen.

set sort_buffer_size=xxxxxx;
 
I

IchHabeEineFr

Gast
Der Key ueber field1 und field2 scheint zu funktionieren, auch wenn ich nicht weiß wie er bei einem "Wert > Datum" irgendeinen Key bildet.

Bekomme ich irgendwie mehr Infos über Statements bei MySQL Explain zeigt mir nur an welche Keys verwendet werden.
SQL:
+----+-------------+--------+-------+---------------+------+---------+------+---------+----------+-----------------------------+
| id | select_type | table  | type  | possible_keys | key  | key_len | ref  | rows    | filtered | Extra                       |
+----+-------------+--------+-------+---------------+------+---------+------+---------+----------+-----------------------------+
|  1 | SIMPLE      | [table]| range | [Key1_field1],[Key2_field1_field2]        | E    | 28      | NULL | 1676284 |   100.00 | Using where; Using filesort |
+----+-------------+--------+-------+---------------+------+---------+------+---------+----------+-----------------------------+
 
I

IchHabeEineFr

Gast
Tablescan wird wohl nur verwendet, wenn in der Spalte type=all (im Explain-Statement) steht. Bei mir steht aber range, weil ich mit limit arbeite. Aber ich schau es mir nochmal näher an, danke.
 
I

ign0rant

Gast
Versuch mal

SQL:
WHERE (field1 = 'wert1' OR field1 = 'wert2' ... OR field1 = 'wert20')

anstatt

SQL:
WHERE [field1] IN ('wert1', 'wert2', '....', 'wert20')
 
I

IchHabeEineFr

Gast
Das hatte ich auch schon versucht, wird von MySQL aber gleich schnell/langsam behandelt. Ich vermute mal das "IN" intern wie "OR" behandelt wird.
 

Lumaraf

Bekanntes Mitglied
Stimmt es das die WHERE Bedingung auf die mehrheit der vorhandenen Datensätze zutrifft?
In dem Fall wird man mit Indizes auf field1/field2 oder änderungen an der Bedingung keinen Nenneswerten verbesserungen bekommen können. Dem ORDER BY ist leider auch nicht ohne weiteres mit einem Index zu helfen da hier gemischte Reihenfolgen vorkommen (field3 und field4 aufsteigend, field5 und field6 absteigend). Außerdem war da glaube ich noch die Einschränkung das ein Index nur für die Sortierung verwendet wird wenn alle Spalten in der gleiche Reihenfolge im ORDER BY stehen.

Versuch mal folgendes:
1. leg einen zweispaltigen Index auf field3 und field4 an
2. probier mal diese Query aus
SELECT * FROM
,(SELECT field3,field4 FROM

WHERE [field1] IN ('wert1', 'wert2', '....', 'wert20')
AND [field2] > 'Datum'
ORDER BY [field3] ASC, [field4] ASC
LIMIT 1,9) AS nested
WHERE
.field1 IN ('wert1', 'wert2', '....', 'wert20')
AND
.field2 > 'Datum'
AND (
.field3,
.field4)<=(nested.field3,nested.field4)
ORDER BY [field3] ASC, [field4] ASC, [field5] DESC, [field6] DESC
LIMIT 10;

Keine Ahnung obs wirklich funktioniert, hab mich zuletzt vor 3 Jahren intensiver mit MySQL beschäftigt.

[EDIT]Hatte in der äußeren Query einen falschen Operator, muß natürlich <= sein [/EDIT]
 
Zuletzt bearbeitet:

Lumaraf

Bekanntes Mitglied
danke, habs probiert. Brachte leider keinen Geschwindigkeitsvorteil.

Ah ich hab nach etwas herumtesten eine geringfügige Variation meiner Query gefunden die zumindestens auf meinen Testdaten schneller lief.

SELECT * FROM
,(SELECT field3,field4 FROM

WHERE [field1] IN ('wert1', 'wert2', '....', 'wert20')
AND [field2] > 'Datum'
ORDER BY [field3] ASC, [field4] ASC
LIMIT 10 ) AS nested
WHERE
.field1 IN ('wert1', 'wert2', '....', 'wert20')
AND
.field2 > 'Datum'
AND (
.field3,
.field4) = (nested.field3,nested.field4)
ORDER BY [field3] ASC, [field4] ASC, [field5] DESC, [field6] DESC
LIMIT 10;
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
U PostgreSQL SELECT Statement Datenbankprogrammierung 5
R Select Statement als temporärer Table Datenbankprogrammierung 7
R Derby/JavaDB Select Statement Where bedingung will nicht ganz! Datenbankprogrammierung 4
R Derby/JavaDB Select TOP Statement geht nicht Datenbankprogrammierung 3
F wie funktioniert if Statement in SELECT? Datenbankprogrammierung 2
J [Hibernate] Select Statement Datenbankprogrammierung 4
T Select Statement auf Relation Datenbankprogrammierung 3
J SELECT-Statement Datenbankprogrammierung 4
I Hibernate / JPA - Spaltenname von Query (Select) bekommen Datenbankprogrammierung 6
OnDemand Select * from bringt keine Rückgabe Datenbankprogrammierung 49
OnDemand Select vs Update ins blaue, was ist teurer? Datenbankprogrammierung 11
M JPA: select all mit unterschiedlichem Tablename Datenbankprogrammierung 2
A MySQL Select und Insert in Java Datenbankprogrammierung 15
J JPA: Wie sieht der select aus? Datenbankprogrammierung 2
D geänderte SELECT Abfragen Datenbankprogrammierung 15
N SQLite Hibernate und Aufruf von Funktion SELECT last_insert_rowid() Datenbankprogrammierung 2
T sqlite select Datenbankprogrammierung 12
D Oracle NullPointerException bei select mit Null Values Datenbankprogrammierung 5
F MySQL Was bedeuten die Einzelnen Zeichen in Select Querrys? Datenbankprogrammierung 1
J SQL SELECT mit einem Array Datenbankprogrammierung 1
J SELECT Abfrage/Suche Datenbankprogrammierung 4
E Kann man in einer if-Bedingung auch SELECT-Statements überprüfen? Datenbankprogrammierung 23
M SQL-Exception trotz funktionierendem SELECT Datenbankprogrammierung 4
L Select Anweisung wird falsch interpretiert Datenbankprogrammierung 3
C HSQLDB Platzhalter in SELECT Datenbankprogrammierung 6
I SELECT bei Datenbankverbindung Datenbankprogrammierung 6
C MySQL JPA - namedQuery (SELECT) -getResultList() - liefert falsches Ergebnis Datenbankprogrammierung 1
S select: alle ergebnisse ermitteln Datenbankprogrammierung 5
G SQLite SQLite Select für View vereinfachen/optimieren Datenbankprogrammierung 4
C SQL-Statement SELECT über 3 Tabellen Datenbankprogrammierung 5
H HSQLDB insert .... values("test1",select test2 from foo) Datenbankprogrammierung 2
D JDBC insert mit select abfrage Datenbankprogrammierung 5
W SELECT oder Programm-Logik Datenbankprogrammierung 10
J Hibernate Select auf Parameterliste Datenbankprogrammierung 3
T MySQL Dynamisch Suchen Select Datenbankprogrammierung 4
D ArrayList in Select Datenbankprogrammierung 12
N Select mit join Datenbankprogrammierung 3
F Oracle select sum() join select sum() Datenbankprogrammierung 9
B SELECT ja - INSERT nein (MySQL) Datenbankprogrammierung 3
R Oracle Performance bei SELECT mit vielen Reihen Datenbankprogrammierung 5
T MySQL Db select * und Insert schlagen fehl Datenbankprogrammierung 2
M Variable in SQL SELECT * FROM ... WHERE mithilfe von PreparedStatement benutzen? Datenbankprogrammierung 28
R Derby/JavaDB Möglichkeit von einem Random Select! Datenbankprogrammierung 6
B Mehrfachschachtelung SELECT Datenbankprogrammierung 2
T MySQL Select: Zusammenfassen von Daten und bilden von Durchschnitt? Datenbankprogrammierung 4
GianaSisters MySQL Datenbank Select error Datenbankprogrammierung 5
S MySQL Problem mit SELECT bzw encoding Datenbankprogrammierung 4
B HSQLDB Probleme mit Select...Where Abfrage Datenbankprogrammierung 16
A SQLite SELECT von ungleichen Spaltenpaaren Datenbankprogrammierung 10
Eldorado MySQL SELECT mit GROUP BY und INNER JOIN Datenbankprogrammierung 2
M Hibernate JPQL SELECT optional? Datenbankprogrammierung 2
C Datenbank-Abfrage, if im Select Datenbankprogrammierung 9
G Aufruf von SELECT INTO Datenbankprogrammierung 8
B H2 PreparedStatement SELECT * FROM ? Datenbankprogrammierung 4
X Select Query auf Substring Datenbankprogrammierung 2
S Select eines bestimmten Datensatzes Datenbankprogrammierung 4
M Select * from mydaten where ... Datenbankprogrammierung 4
T Unerwartete Datenbankausgabe bei "select now()" (es wird ein .0 angehängt) Datenbankprogrammierung 5
M Probleme bei Select in Schleife Datenbankprogrammierung 7
G SELECT liefert leere Zeilen Datenbankprogrammierung 32
M SELECT longtext -> als String behandeln Datenbankprogrammierung 6
H Select in einem Select Datenbankprogrammierung 7
G Select- Abfrage Datenbankprogrammierung 19
S Insert mit Select Datenbankprogrammierung 6
G MSSQL Server SELECT Abfrage funktioniert nicht Datenbankprogrammierung 4
R SELECT aus hsqldb mit Parameter Datenbankprogrammierung 2
H Beim insert bekomme ich den Fehler missing select keyword Datenbankprogrammierung 2
A Problem mit einem Select-Befehl Datenbankprogrammierung 5
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
A SELECT-Anweisung liefert keine Datensätze zurück Datenbankprogrammierung 9
S Select über mehrere Datenbanksysteme Datenbankprogrammierung 14
P SELECT Datenbankprogrammierung 20
T select Abfrage in Java Integer speichern ? Datenbankprogrammierung 2
B fehler bei select befehl Datenbankprogrammierung 5
S Select von bis in DB2 Datenbankprogrammierung 8
S Select mit PreparedStatement Datenbankprogrammierung 2
E Ein If und ein SELECT in Oracle? Datenbankprogrammierung 2
S PostgreSQL SELECT/UPDATE etc. Datenbankprogrammierung 4
4 Probleme mit Select abfrage Datenbankprogrammierung 4
G Fehler in der select-Abfrage Datenbankprogrammierung 3
N SELECT: Datensatz sperren Datenbankprogrammierung 6
isowiz SELECT SUM() Ergebnis in Java abfragen Datenbankprogrammierung 6
T LIMIT In SELECT Anweisung Datenbankprogrammierung 4
R Select und Insert in Schleife - Problem mit ResultSet Datenbankprogrammierung 2
G SELECT Name= " " verhindern Datenbankprogrammierung 5
G Syntax für Select - Abfrage mit Variablen Datenbankprogrammierung 39
R Select auf der Konsole ausgeben Datenbankprogrammierung 2
D brauche mal kurz hilfe bei einem select-stmt Datenbankprogrammierung 6
G Select-Abfragen sind sehr langsam Datenbankprogrammierung 7
D HSQLSB SELECT Datenbankprogrammierung 9
T SQL-Statement Datenbank nach SQL Statement schließen? Datenbankprogrammierung 7
Kotelettklopfer SQLite Verhindern von doppelter Statement Ausführung Datenbankprogrammierung 25
L SQL-Statement SQL Statement doppelte Einträge finden Datenbankprogrammierung 9
C MySQL SQL Statement wir nicht ausgeführt Datenbankprogrammierung 11
G Datenbank Statement Datenbankprogrammierung 22
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
B MySQL Umkreissuche - brauche Hilfe bei SQL Statement Datenbankprogrammierung 12
M CSV Import - Dynamisches SQL Statement Datenbankprogrammierung 15
D Wiederverwendung / Recycling / Queuing von Statement Objekten Datenbankprogrammierung 1
D SQL Statement gesucht... Datenbankprogrammierung 15

Ähnliche Java Themen

Neue Themen


Oben