sql >> Databasteknik >  >> RDS >> Mysql

MySQL använder inte index när du kontrollerar =1 , men använder det med =0

Varför använder inte MySQL ett index?
MySQL kommer inte att använda ett index om en hög procentandel av raderna har det värdet.

Varför kommer att lägga till use index till frågan fungerar inte här
Lägga till ett use index klausul kommer inte att ha någon effekt, eftersom use index kommer bara att föreslå vilket index att använda, kommer det inte att föreslå om ett index ska användas eller inte.

Varning när du använder testtabeller med få rader
Detta är särskilt irriterande när du använder testtabeller med få rader eftersom MySQL kommer att vägra använda ett index, och det är svårt att se vad som är fel med din fråga.
Så se till att du lägger till tillräckligt många rader i en testtabell för att göra det till ett realistiskt test.

Är det meningslöst att använda ett index på kolumner med låg kardinalitet?
Indexering på booleska kolumner är inte lika användbart som du trodde innan du ställde den här frågan.
Men det är inte heller onyttigt antingen.
Med InnoDB MySQL kommer att försöka hämta data med hjälp av indexen om möjligt, om ditt booleska fält har ett index, fråga:

SELECT id, bool_field FROM table_with_many_columns_and_rows WHERE bool_field = 1

Kan läsa all data i det täckande indexet för bool_field eftersom sekundära index i InnoDB alltid inkluderar det primära indexet (id) likaså.
Detta är snabbare eftersom MySQL inte behöver läsa in hela tabellen i minnet.

I MyISAM fungerar inte detta och MySQL kommer att undersöka hela tabellen.

Men jag kan använda force index
Du kan, men på låga kardinalitetsindex kommer det att göra din fråga långsammare, inte snabbare. Åsidosätt endast indexen för komplexa frågor och endast om du känner till reglerna som MySQL använder för att välja index.

Länkar:
Se:http://dev.mysql .com/doc/refman/5.1/en/mysql-indexes.html
och: http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/

Om du vill ha en bok om detta ämne:läs
High performance MySQL:http://oreilly.com /catalog/9780596003067



  1. Vilka är de livskraftiga databasabstraktionslagren för Python

  2. SQL mellan inte inkluderande

  3. SQL Server 2008 Vertikal data till horisontell

  4. Vilka är praktiska skillnader mellan `REPLACE` och `INSERT ... ON DUPLICATE KEY UPDATE` i MySQL?