sql >> Database >  >> RDS >> Mysql

MySQL-queryoptimalisatie van LIKE-term% ORDER BY int

U stelde een andere vraag "Een index maken die het beste is voor zoeken met jokertekens door 40 miljoen namen". Oké, je hebt 40 miljoen records.

Overweeg nu de volgende formule:

x = COUNT(DISTINCT values in a column) / COUNT(values in a column)

Een index op een kolom is veel beter, hoe dichter x is tot 1. Als het 1 is, zijn alle waarden verschillend, er zijn geen duplicaten en een index is daarom vrij snel.

Je zoekt nu naar 'john%'. Dat zijn 4 letters en een open einde. Welke letters niet belangrijk zijn, uw DB heeft te maken met 26*26*26*26=456976 verschillende waarden. Zet dat in bovenstaande formule en je 40 miljoen records. Je krijgt een x van 0,0114244.

Ik weet niet wat de drempel ook alweer is, maar IIRC is 0,1 of zoiets. Dus, als je x . bent hoger is dan 0,1 wordt de index gebruikt, als deze lager is, is dat niet het geval.

Waarom is dat zo? Het gebruik van een index kan de zaak zelfs vertragen, want je DB moet naar de index kijken, in die index zien op welke positie op je fysieke harde schijf het juiste record staat en dan dat record ophalen. Daarom is het sneller om een ​​scan van een hele tafel uit te voeren als x lager is dan 10%.

Samenvattend:40 miljoen records filteren met slechts één zwakke index zoals die van u is gewoon nutteloos.



  1. XML-bestand importeren in Oracle XML DB Repository

  2. mySQL selecteer postcodes binnen x km/mijlen binnen het bereik van y

  3. Uitleg nodig over karaktertypes in PostgreSQL

  4. Hoe een integer-uitvoer van een SQL-query te krijgen