MySQL: Indices richtig setzen
Hannes
- datenbank
Schönen Tag liebes Forum,
ich habe hier eine Abfrage:
SELECT
pk_id
FROM
myTable
WHERE
veroeffentlichungsdatum >= '2006-01-01'
AND
schlusstermin < NOW()
AND
schlusstermin <> '1900-01-01'
AND
pk_id NOT IN ( 94923,94924,5345345,34534,534545,546,756,7567 )
die über eine sehr große Tabelle mit ca. 500.000 Datensätzen geht.
pk_id = Primary Key
Jetzt habe ich schon ein paar Varianten mit Indices versucht, damit die Abfrage schneller geht, denn in:
pk_id NOT IN ( 94923,94924,5345345,34534,534545,546,756,7567 )
stehen, dann bis zu 300.000 Ids, die nicht mehr selektiert werden sollen und dies wird mir leider beim Index:
pk_id, veroeffetnlichungsdatum, schlusstermin
nie genommen.
Wie muss ich also die Abfrage umbauen, oder einen Index verwenden, damit diese Abfrage schnell wird?
Danke jetzt schon für die Hilfe.
Hannes
Hello,
pk_id NOT IN ( 94923,94924,5345345,34534,534545,546,756,7567 )
das ist vielleicht keine befriedigende Antwort, sondern nur ein Bauchgefühl, aber wenn das Ding hier eine Liste von hunderten oder tausenden Einträgen umfasst, dann wird das enorm ineffizient: du brauchst riesigen Speicher, damit du überhaupt den Querystring in seiner Rohform dort ablegen kannst, der SQL-Parser braucht ewig um den String wieder in die einzelnen IDs zu zerlegen und auf INT zu casten, ...
Ich würde mal schauen, ob sich da eine andere Lösung findet, vielleicht eine temporäre Tabelle, meinetwegen bestehend aus sessionid|dont_include_this_id mit einem Index und darauf dann ein Join oder Subselect oder einfaches NOT IN (SELECT...).
MfG
Rouven
Moin!
Wie muss ich also die Abfrage umbauen, oder einen Index verwenden, damit diese Abfrage schnell wird?
EXPLAIN vor das Statement geschrieben sagt dir, welche Indices jetzt benutzt werden. Und das Handbuch sagt dir, was die Indextypen bedeuten, die da ausgeworfen werden.
Und deine Analyse sagt dir dann, ob man das noch verbessern kann. Beim dritten Schritt kann das Forum auch helfen.
- Sven Rautenberg