sql >> Database >  >> RDS >> Mysql

MySQL gebruikt geen index bij het controleren =1 , maar gebruikt het met =0

Waarom gebruikt MySQL geen index?
MySQL zal geen index gebruiken als een groot percentage van de rijen heeft die waarde.

Waarom zal het toevoegen van use index naar de zoekopdracht werkt hier niet
Een use index toevoegen clausule heeft geen effect, omdat use index zal alleen welke suggest voorstellen index te gebruiken, zal het niet voorstellen of een index moet worden gebruikt of niet.

Voorbehoud bij gebruik van testtabellen met weinig rijen
Dit is vooral vervelend bij het gebruik van testtabellen met weinig rijen, aangezien MySQL weigert een index te gebruiken en het moeilijk is om te zien wat er mis is met uw zoekopdracht.
Zorg er dus voor dat u voldoende rijen aan een testtabel toevoegt om er een realistische test van te maken.

Is het nutteloos om een ​​index op kolommen met een lage kardinaliteit te gebruiken?
Indexeren op booleaanse kolommen is niet zo nuttig zoals je dacht voordat je deze vraag stelde.
Het is echter ook niet nutteloos ofwel.
Met InnoDB MySQL zal proberen gegevens op te halen met behulp van de indexen, indien mogelijk, als uw booleaanse veld een index heeft, de query:

SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1

Kan alle gegevens in de dekkingsindex lezen voor bool_field omdat secundaire indexen in InnoDB altijd de primaire index (id) bevatten ook.
Dit is sneller omdat MySQL niet de hele tabel in het geheugen hoeft in te lezen.

In MyISAM werkt dit niet en MySQL zal de hele tabel onderzoeken.

Maar ik kan force index gebruiken
Dat kan, maar bij indexen met een lage kardinaliteit wordt uw zoekopdracht langzamer, niet sneller. Overschrijf alleen de indexen voor complexe zoekopdrachten en alleen als je de regels kent die MySQL gebruikt om indexen te selecteren.

Links:
Zie:http://dev.mysql .com/doc/refman/5.1/en/mysql-indexes.html
en: http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

Als je een boek over dit onderwerp wilt:lees
High performance MySQL:http://oreilly.com /catalog/9780596003067



  1. Waarde van primaire sleutel bijwerken met entiteitsraamwerk

  2. MySQL Left Joins:selecteer alles uit één tabel, maar pas de waarde in de tweede tabel met criteria aan

  3. MySQL Toon indexen in database

  4. Zijn gebruikers 'Gebruiker'@'%' en 'Gebruiker'@'localhost' niet hetzelfde?