sql >> Database >  >> RDS >> Mysql

Indexering voor keyset-paginering in mysql

Ik ben dit probleem eerder tegengekomen. Hier is mijn analyse ervan.

  • Het komt voor in MySQL 5.7 en 8.0, maar blijkbaar niet in oudere versies en niet in MariaDB.

  • De "oplossing" die ik verkies is om de indexen als volgt te wijzigen:

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

Hoewel de 2-koloms index theoretisch identiek is aan de één-koloms index voor InnoDB (ervan uitgaande dat id is de PK`), lijkt de Optimizer dit feit in sommige situaties . te negeren .

Ik vind het ook leuk om de PK expliciet toe te voegen wanneer ik een behoefte zie . Dit signaleert toekomstige lezers van het schema (inclusief ikzelf) dat sommige zoekopdrachten baat hebben bij het toevoegen van de PK.

Ik heb nog geen geval gevonden waarin "index merge intersect" sneller is dan een equivalente samengestelde index.

Ik hou er niet van om ooit index-hints te gebruiken uit angst dat de gegevensdistributie in de toekomst zal veranderen en mijn 'hint' de zaken erger zal maken.



  1. ERROR 1093 (HY000):U kunt de doeltabel 'a' voor update niet specificeren in de FROM-clausule

  2. Een schemagebonden weergave maken in SQL Server

  3. Wederzijdse vrienden sql met join (Mysql)

  4. MySQL INSERT ... ON DUPLICATE KEY UPDATE op Java:Hoe te verschillen Ingevoegd/Bijgewerkt/GeenChange-statussen