MySQL INDEX wird bei JOIN nicht verwendet
Tobias
- mysql
0 Rolf B0 MudGuard
0 Email0 Nachfrager-1 Email
Hallo,
ich habe ein kurioses PRoblem. Ein Index wird nicht verwendet, obwohl er exitiert und eigentlich auch angesprochen werden muss.
SELECT *
FROM ticket_info
JOIN ticket USE INDEX (PRIMARY) ON ticket_info.ticket_id=ticket.id
WHERE ticket_info.type='3' AND ticket_info.value='100141580'
0,15 sek
SELECT *
FROM ticket_info
WHERE ticket_info.type='3' AND ticket_info.value='100141580'
0,04sek - eine Reihe mit der ID 70903
SELECT *
FROM ticket
WHERE id='70903'
0,00013 sek
EXPLAIN erste Abfrage - es wird kein Key verwendet. Warum nicht?
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE ticket ALL PRIMARY 71990
1 SIMPLE ticket_info eq_ref unique_index,index_ticket,index_type_date,index_type,index_type_value unique_index 8 slewo_live.ticket.id,const 1 Using where
Hallo Tobias,
erster Ansatz, wenn Indexe nicht verwendet werden, ist ein Update der Statistiken.
Danach kann man überlegen, ob und warum der Optimizer befindet, dass ein Indexeinsatz nicht lohnt. Welche Indexe hast Du und wie sind sie definiert?
Rolf
Hi,
Danach kann man überlegen, ob und warum der Optimizer befindet, dass ein Indexeinsatz nicht lohnt. Welche Indexe hast Du und wie sind sie definiert?
Und wieviele Zeilen enthalten die Tabellen?
cu,
Andreas a/k/a MudGuard
Nur eine Anmerkung: Dein Primary Key ist mit 71990 Bytes ziemlich lang. Ist da etwa UTF-8 für dieses Feld eingestellt? Zeig mal Create....
PS: Wurde für eine ganze Tabelle ein bestimmtes Charset, zum Beispiel CHARSET=UTF8 deklariert, gilt das für alle Felder sofern diese im Einzelnen nicht anders deklariert sind. Wenn eine solche Tabelle indiziert wird, wächst natürlich auch die Datenmenge des Index auf ein Mehrfaches, was u.U. nicht erwünscht ist. Einem solchen Verhalten lässt sich abhelfen, indem die Schlüsselfelder für Latin1 deklariert werden.
Dein Primary Key ist mit 71990 Bytes ziemlich lang.
Das ist allerdings eine sehr mutige Aussage, wenn man nicht weiß wie viele Zeilen die Tabelle hat und den Inhaltstyp der Spalte, also des Keys nicht kennt.
Ist da etwa UTF-8 für dieses Feld eingestellt?
Diese Ursachenvermutung liegt auch nicht gerade nahe:
WHERE ticket_info.type='3' AND ticket_info.value='100141580'
Denn das sieht trotz der Quotas ziemlich numerisch aus. Vielleicht ergibt sich daraus ein Optimierungspotential.
Zeig mal Create....
Genau so. Und wie von MudGuard angeregt wäre zudem eine Aussage zur Zeilenzahl der beiden Tabellen sicherlich hilfreich.
Dein Primary Key ist mit 71990 Bytes ziemlich lang.
Das ist allerdings eine sehr mutige Aussage,
Geläufig sind Längen von 128, 512 bis 1024 Bytes. Und auch ein 64-Bit-Integer benötigt eben nur 64 Bit, also 8 Bytes.
Ältere MySQL Versionen haben übrigens auch nur max. 255 bytes für einen Primary Key zugelassen. Es gibt auch keinen wirklichen Grund, für charset UTF8 an Schlüsselfeldern. Wir haben mal gelernt, daß Nutzdaten ohnehin von Schlüsselfeldern getrennt werden sollen. Vielleicht ist auch ein zu großer Index der Grund dafür daß er nicht verwendet wird. Das halte ich hier in diesem Fall für naheliegend. MFG