sql >> Databasteknik >  >> RDS >> Mysql

MySQL-frågeoptimering av LIKE term% ORDER BY int

Du ställde en annan fråga "Skapa ett index som är bäst för jokerteckensökning genom 40 miljoner namn". Okej, du har 40 miljoner poster.

Överväg nu följande formel:

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

Ett index på en kolumn är mycket bättre, ju närmare x är till 1. Om det är 1 är alla värden distinkta, det finns inga dubbletter och ett index är därför ganska snabbt.

Nu letar du efter 'john%'. Det är 4 bokstäver och ett öppet slut. Vilka bokstäver är inte viktiga, din DB måste hantera 26*26*26*26=456976 distinkta värden. Lägg det i ovanstående formel och dina 40 miljoner poster. Du får en x av 0,0114244.

Jag vet inte vad som är tröskeln igen, men IIRC är det 0,1 eller något. Så, om du är x är över 0,1 används indexet, om det är lägre är det inte det.

Varför är det så? Att använda ett index kan till och med sakta ner saker, orsaka att din DB måste titta på indexet, se i det indexet på vilken position på din fysiska hårddisk den lämpliga posten är och sedan hämta den posten. Därför, när x är under 10 % går det snabbare bara att göra en hel tabellskanning.

För att sammanfatta:Att filtrera 40 miljoner poster med bara ett svagt index som ditt är helt enkelt värdelöst.



  1. Oracle flytta kolumnen till den första positionen

  2. sök från flera tabeller med ett enda nyckelord i mysql

  3. går det snabbare att läsa från MySQL eller går det snabbare att läsa från en fil?

  4. Tilldela månadens totala värde till varje dag i månaden