Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Indizierung für Keyset-Paginierung in mysql

Ich bin auf dieses Problem schon einmal gestoßen. Hier ist meine Analyse dazu.

  • Es kommt in MySQL 5.7 und 8.0 vor, aber anscheinend nicht in älteren Versionen und nicht in MariaDB.

  • Die "Lösung", die ich bevorzuge, besteht darin, die Indizes folgendermaßen zu ändern:

       INDEX(company_id)      -- DROP this
       INDEX(company_id, id)  -- ADD this
    

Obwohl der zweispaltige Index theoretisch identisch mit dem einspaltigen Index für InnoDB ist (unter der Annahme von id ist das PK`), scheint der Optimierer diese Tatsache in manchen Situationen zu ignorieren .

Außerdem füge ich den PK gerne explizit hinzu, wenn ich einen Bedarf sehe . Dies signalisiert zukünftigen Lesern des Schemas (mich eingeschlossen), dass einige Abfragen davon profitieren, dass das PK angehängt wird.

Ich habe noch keinen Fall gefunden, in dem "Index Merge Intersect" schneller ist als ein äquivalenter zusammengesetzter Index.

Ich verwende niemals "Hinweise" für den Index, aus Angst, dass sich die Datenverteilung in Zukunft ändern wird und mein "Hinweis" die Dinge verschlimmern wird.