sql >> Databasteknik >  >> RDS >> Mysql

indexera ett bitfält i MYSQL

Generellt sett nej. Ett bi-state-fält påskyndar inte frågor när de indexeras eftersom du måste titta på halva raderna i genomsnitt. Du vill att dina indexposter ska vara selektiva - en given post i indexet bör endast representera en liten andel av de möjliga värdena (säg mindre än 10 %, helst i bråkdelen av en procent). När du använder indexet ignoreras de flesta data i tabellen, vilket är det som ger dig en prestationsfördel.

Vissa DBMS stöder bitmappsindex. De kan hjälpa, men du stöter fortfarande på problemet med selektivitet.

Den uppdaterade frågan säger att antalet värden med värde 1 kommer att vara litet (mindre än en procent); kommer ett index att ge dig en förmån nu?

Svaret är:

  • För de frågor där du anger att värdet är 1, ja, ett index i kolumnen kan ge en fördel, förutsatt att optimeraren faktiskt använder indexet. Du kan behöva justera DBMS för att få det att inse att indexet är skevt till förmån för att använda det med frågor där värdet är 1; detta tenderar att vara DBMS-specifikt, men uppdatering av statistik i olika skepnader är namnet på spelet, möjligen med hjälp av tips i SQL-frågorna också. Naturligtvis, om optimeraren aldrig använder indexet, ger det fortfarande ingen fördel - och optimeraren kan besluta att andra index hjälper den mer på något sätt.

  • För de frågor där värdet är 0 ska indexet inte användas. Chansen är dock att DBMS kommer att fortsätta att upprätthålla indexet för 0-värdena också - även om det aldrig borde använda dem. Det skulle vara en ovanlig DBMS som skulle kunna beordras "indexera bara denna kolumn för andra värden än noll", även om det skulle vara mycket fördelaktigt.

Så - det beror på. Det beror på frågorna och det beror på optimeraren.

Observera också att ett sammansatt index - på några andra vanligt använda kolumner och sedan bitfältet mycket väl kan ge en viss fördel. Så om du nästan alltid väljer ett datumintervall bör ett sammansatt index på datum- och bitfältskolumnerna (förmodligen i den ordningen) ge dig ett bra index.



  1. PHP While loop visar endast sista raden

  2. Hur upptäcker man om en användare har loggat ut i php?

  3. Sök efter "helordsmatchning" med SQL Server LIKE-mönster

  4. Hur man gör sql-mode=NO_ENGINE_SUBSTITUTION permanent i MySQL my.cnf