sql >> Database >  >> RDS >> Mysql

Wat is de Big-O voor SQL select?

Aangezien u het geselecteerde algoritme niet beheert, is er geen manier om dit direct te weten. Zonder indexen zou een SELECT echter O(n) moeten zijn (een tabelscan moet elk record inspecteren, wat betekent dat het meeschaalt met de grootte van de tabel).

Met een index is een SELECT waarschijnlijk O(log(n)) (hoewel het zou afhangen van het algoritme dat wordt gebruikt voor indexering en de eigenschappen van de gegevens zelf als dat geldt voor een echte tabel). Om uw resultaten voor een tabel of query te bepalen, moet u voor de zekerheid uw toevlucht nemen tot profilering van gegevens uit de echte wereld.

INSERT zonder indexen zou heel snel moeten zijn (dicht bij O(1)) terwijl UPDATE eerst de records moet vinden en dus langzamer (iets) zal zijn dan de SELECT die je daar brengt.

INSERT met indexen zal waarschijnlijk weer in de marge van O(log(n^2)) zijn wanneer de indexboom opnieuw in evenwicht moet worden gebracht, anders dichter bij O(log(n)). Dezelfde vertraging zal optreden met een UPDATE als deze van invloed is op geïndexeerde rijen, bovenop de SELECT-kosten.

Alle weddenschappen zijn uitgeschakeld als je het eenmaal hebt over JOIN in the mix:je zult je moeten profileren en je databases query-schattingstools moeten gebruiken om erover te lezen. Houd er ook rekening mee dat als deze zoekopdracht prestatiekritisch is, u moet opnieuw profiel van tijd tot tijd omdat de algoritmen die door uw query-optimizer worden gebruikt, veranderen als het laden van gegevens verandert.

Nog iets om in gedachten te houden... big-O vertelt je niet over vaste kosten voor elke transactie. Voor kleinere tafels zijn deze waarschijnlijk hoger dan de werkelijke werkkosten. Als voorbeeld:de setup-, demontage- en communicatiekosten van een cross-netwerkquery voor een enkele rij zullen zeker meer zijn dan het opzoeken van een geïndexeerd record in een kleine tabel.

Hierdoor ontdekte ik dat het kunnen bundelen van een groep gerelateerde zoekopdrachten in één batch veel meer invloed kan hebben op de prestaties dan enige optimalisatie die ik heb gedaan voor de database zelf.



  1. CHAR() of VARCHAR() als primaire sleutel in een ISAM MySQL-tabel?

  2. Hoe moet ik gegevens uit CSV in een Postgres-tabel importeren met pgAdmin 3?

  3. Databases beheren met phpMyAdmin

  4. Hoe de MySQL-opgeslagen procedure in Python aan te roepen?