sql >> Database >  >> RDS >> Mysql

Waarom zijn de prestaties van MySQL-query's zo slecht bij gebruik van een CHAR/VARCHAR-index?

Het probleem is duidelijk dat de query een indexscan uitvoert. De alternatieve benadering zou zijn om twee indexzoekopdrachten uit te voeren, voor de eerste en laatste waarden die hetzelfde zijn, en dan meta-informatie in de index te gebruiken voor de berekening. Op basis van uw waarnemingen doet MySQL beide.

De rest van dit antwoord is speculatie.

De reden dat de prestatie "slechts" 300 keer langzamer is, in plaats van 200.000 keer langzamer, is vanwege overhead bij het lezen van de index. Het scannen van de invoer gaat vrij snel in vergelijking met andere bewerkingen die nodig zijn.

Er is een fundamenteel verschil tussen getallen en tekenreeksen als het gaat om vergelijkingen. De engine kan gewoon naar de bitrepresentaties van twee getallen kijken en herkennen of ze hetzelfde of verschillend zijn. Helaas moet je voor strings rekening houden met codering/sortering. Ik denk dat het daarom naar de waarden moet kijken.

Het is mogelijk dat als u 216.000 exemplaren had van exact dezelfde string, dan zou MySQL de telling kunnen doen met behulp van metadata in de index. Met andere woorden, de indexer is slim genoeg om metadata te gebruiken voor exacte vergelijkingen van gelijkheid. Maar het is niet slim genoeg om rekening te houden met codering.



  1. Probleem met formulier verzenden... Toets invoeren

  2. NUMTOYMINTERVAL() Functie in Oracle

  3. Vind, prioriteer en los problemen met SQL Server in enkele minuten op

  4. ORA-04076:ongeldige NIEUWE of OUDE specificatie - PL/SQL - Oracle Trigger