sql >> Database >  >> RDS >> Mysql

indexeer een bitveld in MYSQL

Over het algemeen niet. Een bi-state veld versnelt zoekopdrachten niet wanneer het is geïndexeerd, omdat je gemiddeld naar de helft van de rijen moet kijken. U wilt dat uw indexitems selectief zijn - een bepaald item in de index zou slechts een klein percentage van de mogelijke waarden moeten vertegenwoordigen (bijvoorbeeld minder dan 10%, bij voorkeur in fracties van een procent). Als u de index gebruikt, worden de meeste gegevens in de tabel genegeerd, wat u een prestatievoordeel oplevert.

Sommige DBMS ondersteunen bitmapindexen. Ze kunnen helpen, maar je loopt nog steeds tegen het selectiviteitsprobleem aan.

De bijgewerkte vraag zegt dat het aantal waarden met waarde 1 klein zal zijn (minder dan één procent); geeft een index u nu een voordeel?

Het antwoord is:

  • Voor die zoekopdrachten waarbij u opgeeft dat de waarde 1 is, dan zou een index op de kolom een ​​voordeel kunnen bieden, op voorwaarde dat de optimizer daadwerkelijk gebruik maakt van de index. Mogelijk moet u het DBMS aanpassen om te realiseren dat de index scheef is, zodat u deze kunt gebruiken met query's waarvan de waarde 1 is; dit is meestal DBMS-specifiek, maar het bijwerken van statistieken in verschillende gedaanten is de naam van het spel, mogelijk met behulp van hints in de SQL-query's. Natuurlijk, als de optimizer de index nooit gebruikt, biedt het nog steeds geen voordeel - en de optimizer kan besluiten dat andere indexen het op de een of andere manier meer helpen.

  • Voor die zoekopdrachten waarbij de waarde 0 is, mag de index niet worden gebruikt. De kans is echter groot dat het DBMS ook de index voor de 0-waarden zal blijven behouden, hoewel het deze nooit zou moeten gebruiken. Het zou een ongebruikelijk DBMS zijn dat zou kunnen worden opgedragen 'indexeer deze kolom alleen voor de andere waarden dan nul', ook al zou dat zeer gunstig zijn.

Dus - het hangt ervan af. Het hangt af van de zoekopdrachten en het hangt af van de optimizer.

Merk ook op dat een samengestelde index - op sommige andere gewoonlijk gebruikte kolommen en dan het bit-veld wellicht enig voordeel kan opleveren. Dus als u bijna altijd op een datumbereik selecteert, dan zou een samengestelde index op de datum- en bitveldkolommen (waarschijnlijk in die volgorde) u een goede index moeten geven.



  1. Hoe PII te vinden en te maskeren in Elasticsearch

  2. virtualenv pip mysqldb mac os X python

  3. Voorwaardelijke WHERE-clausule met CASE-instructie in Oracle

  4. Hoe u identiteitskolomwaarden kunt krijgen zonder de naam van de identiteitskolom te vermelden in Select - SQL Server / T-SQL-zelfstudie, deel 46