MySQL er en åpen kildekode relasjonell database management system ( RDBMS ) . På grunn av sin lave kostnader , er organisasjoner i økende grad bruker det for store databaser . Jo større databasen, jo mer sannsynlig en spørring returnere mange dupliserte rader , noe som gjør produksjonen vanskelig å lese og søket treg. Bruke DISTINCT søkeord i SELECT-setninger kan eliminere disse duplikater i produksjonen din . Hvorfor du får like resultater
Vanligvis betyr en spørring ikke vise alle kolonnene i tabellen eller tabellene den refererer til. En arbeidsgiver kan , for eksempel , har en tabell som sporer ansattes fravær . Hvis han ønsker å finne ut hvilke ansatte som hadde minst ett fravær i den siste måneden , kan han bruke en spørring som ser omtrent slik ut : en
SELECT employees.first_name , employees.last_nameFROM ansatte, absencesWHERE employees.employee_id = absences.employee_idAND absences.date > = ' Jun- 01-09 ';
p Hvis Bob Smith var fraværende i tre dager i juni , vil søkeresultatene inneholde tre rader med Bob Smith. Selv om søket ikke vise datoen , siden Bob tre fravær var på forskjellige datoer , returnerer spørringen hver av de tre radene .
Hvorfor dupliserte resultater Er Bad
< p> Duplicate rader ikke bare gjøre utgang vanskelig å lese , de også tregere søket og hog database ressurser . Med mindre din database er svært liten , har du sannsynligvis utvikle dine SQL-skript i en utvikling database instans som er atskilt fra produksjonen eksempel. Det er ikke uvanlig for utvikling tilfeller å ha langt mindre data i dem enn produksjonen instans.
P Hvis du tillater dupliserte rader i utskriften , du gjør din database søk hele veien gjennom alle tabeller du har knyttet sammen i søket . Dette kan gjøre en spørring som kjørte fort nok i din dev eksempel treg til en gjennomgang i produksjonen. Hvis produksjonen databasen er stor , kan søket kjøre i timevis
Bruke og optimalisere DISTINCT
Følgende utvalgte returnerer en rad for Bob Smith : .
SELECT DISTINCT employees.first_name , employees.last_nameFROM ansatte , absencesWHERE employees.employee_id = absences.employee_idAND absences.date MELLOM '2009 -06- 01 ' og '2009 -07- 01' ;
dine resultater er lettere å lese , men databaseserveren din har fortsatt å jobbe for hardt hvis tabellen employee har mye flere rader enn ditt fravær tabellen . . MySQL vil gå gjennom hver post i Ansatte-tabellen for å se om at arbeidstaker har noen fravær
I stedet gjør DISTINCT arbeid for deg å gjøre søket mer effektiv : en
SELECT DISTINCT employees.first_name , employees.last_nameFROM ansatte , absencesWHERE absences.employee_id = employees.employee_idAND absences.date > = ' Jun- 01-09 ';
Dette søket vil ta en rekord i fravær bordet og slutte å lete tabellen employee når den finner den ansatte som går med at fravær . Din forespørsel vil bare kjøre så mange søk som er fravær , og vil søke gjennom langt mindre av tabellen employee på hvert søk . Den bruker færre database ressurser og går mye raskere.