MySQL är en öppen källkod relationsdatabas management system ( RDBMS ) . På grund av dess låga kostnader , är organisationer använder allt det för stora databaser . Ju större databasen , desto mer sannolikt en fråga återvända många dubblerade rader , vilket gör produktionen svår att läsa och frågan långsam . Använda nyckelordet DISTINCT i din SELECT-satser kan eliminera dessa dubbletter i din produktion . Varför du får dubbletter resultat
Vanligtvis visas inte en fråga inte alla kolumner i tabellen eller tabellerna referenser . En arbetsgivare kan till exempel ha en tabell som spårar anställdas frånvaro . Om han vill ta reda på vilka anställda hade åtminstone en frånvaro under den senaste månaden , kan han använda en fråga som ser ut ungefär så här :
VÄLJ employees.first_name , employees.last_nameFROM anställda , absencesWHERE employees.employee_id = absences.employee_idAND absences.date > = ' jUN- 01-09 ' ,
p Om Bob Smith var frånvarande under tre dagar i juni kommer de frågeresultat innehålla tre rader av Bob Smith . Även om frågan inte visa datum , eftersom Bobs tre frånvaro var på olika datum , returnerar den här frågan var en av de tre raderna .
Varför dubbletter resultat är dåliga
Dubblettrader inte bara göra din produktion svårt att läsa , saktar också ner din fråga och hog resurser databas . Om inte din databas är mycket liten , utvecklar du förmodligen dina SQL-skript i en utveckling databas instans som är separat från din produktion instans . Det är inte alls ovanligt att utvecklingen instanser att ha betydligt mindre data i dem än produktionen instans .
P Om du tillåter dubbletter rader i din produktion , du gör din databassökning hela vägen genom alla tabeller du har gått samman i din fråga . Detta kan göra en fråga som sprang tillräckligt snabbt i din dev instans långsam till en genomsökning i produktionen . Om din produktion databasen är stor , kan din fråga springa i timmar
Använda och optimera DISTINCT
Följande SELECT returnerar en rad för Bob Smith : .
SELECT DISTINCT employees.first_name , employees.last_nameFROM anställda , absencesWHERE employees.employee_id = absences.employee_idAND absences.date MELLAN '2009 -06- 01 ' AND '2009 -07- 01' ;
dina resultat är lättare att läsa , men din databasserver fortfarande måste arbeta för hårt om din anställde tabellen har mycket fler rader än din frånvaro tabellen . . MySQL kommer att gå igenom varje post i tabellen Anställda för att se om den anställde har någon frånvaro
Istället gör DISTINCT arbete för dig att göra din sökning mer effektivt :
SELECT DISTINCT employees.first_name , employees.last_nameFROM anställda , absencesWHERE absences.employee_id = employees.employee_idAND absences.date > = ' JUN- 01-09 ' ,
Denna fråga kommer att ta en post i frånvaro tabellen och sluta söka den anställde tabellen när den finner den anställde som går med denna frånvaro . Din fråga kommer bara köra så många sökningar som det finns frånvaro , och kommer att söka igenom mycket mindre av den anställde tabellen på varje sökning . Den använder färre databas resurser och går mycket snabbare .