Tobias: MySQL INDEX wird bei JOIN nicht verwendet

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

  1. Hallo Tobias,

    erster Ansatz, wenn Indexe nicht verwendet werden, ist ein Update der Statistiken.

    If you have a problem with indexes not being used when you believe that they should be, run ANALYZE TABLE to update table statistics, such as cardinality of keys, that can affect the choices the optimizer makes. See Section 13.7.2.1, “ANALYZE TABLE Syntax”.

    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

    --
    sumpsi - posui - clusi
    1. 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

  2. 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.

    1. 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.

      1. 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