sql >> Database teknologi >  >> RDS >> Mysql

Hvad er Big-O for SQL select?

Da du ikke kontrollerer den valgte algoritme, er der ingen måde at vide det direkte. Uden indekser bør en SELECT dog være O(n) (en tabelscanning skal inspicere hver post, hvilket betyder, at den skaleres med tabellens størrelse).

Med et indeks er en SELECT sandsynligvis O(log(n)) (selvom det ville afhænge af algoritmen, der bruges til indeksering og egenskaberne for selve dataene, hvis det gælder for en hvilken som helst reel tabel). For at bestemme dine resultater for enhver tabel eller forespørgsel skal du ty til profilering af data fra den virkelige verden for at være sikker.

INSERT uden indekser bør være meget hurtig (tæt på O(1)), mens UPDATE skal finde posterne først og derfor vil være langsommere (lidt) end SELECT, der bringer dig derhen.

INSERT med indekser vil sandsynligvis igen være i boldbanen af ​​O(log(n^2)), når indekstræet skal rebalanceres, ellers tættere på O(log(n)). Den samme afmatning vil ske med en OPDATERING, hvis den påvirker indekserede rækker, oven i SELECT-omkostningerne.

Alle væddemål er slået fra, når du taler om JOIN i blandingen:du bliver nødt til at profilere og bruge dine databaser forespørgselsestimeringsværktøjer for at få læst det. Bemærk også, at hvis denne forespørgsel er ydelseskritisk, bør du gen profil fra tid til anden, da de algoritmer, der bruges af din forespørgselsoptimering, vil ændre sig, efterhånden som databelastningen ændres.

En anden ting at huske på... big-O fortæller dig ikke om faste omkostninger for hver transaktion. For mindre borde er disse sandsynligvis højere end de faktiske arbejdsomkostninger. Som et eksempel:Opsætnings-, rivnings- og kommunikationsomkostningerne for en forespørgsel på tværs af netværk for en enkelt række vil helt sikkert være mere end opslaget af en indekseret post i en lille tabel.

På grund af dette fandt jeg ud af, at det at være i stand til at samle en gruppe af relaterede forespørgsler i én batch kan have langt større indflydelse på ydeevnen end nogen optimering, jeg foretog til den egentlige database.



  1. mysql tidssammenligning

  2. Pivot ved hjælp af SQL Server 2000

  3. Oracle.DataAccess.Dll-indlæsningsproblem på x-64-maskine

  4. NHibernate Postgresql DateTime til Tidskonvertering