sql >> Databasteknik >  >> RDS >> Mysql

CASE-prestanda i MySQL?

I stort sett allt funktioner per rad kommer att påverka prestandan, den enda riktiga frågan är:"Är effekten liten nog att inte oroa sig för?".

Detta är något du bör upptäcka genom att mäta snarare än att gissa. Databasadministration är bara en ställ-och-glöm-aktivitet om varken dina data eller dina frågor någonsin ändras. Annars bör du regelbundet övervaka prestandan för att säkerställa att inga problem uppstår.

Med "tillräckligt liten" i kommentarerna ovan menar jag att du förmodligen inte behöver oroa dig för prestandan av något som:

select * from friends where lowercase(lastname) = "smith"

om du bara har tre vänner.

Effekterna av dessa saker blir allvarligare när bordet ökar i storlek. Till exempel, om du har hundra miljoner kunder och du vill hitta alla som troligen är datorrelaterade, skulle du inte vilja prova:

select name from customers where lowercase(name) like '%comp%'

Det kommer sannolikt att få dina DBA:er ner på dig som massor av tegelstenar.

Ett sätt vi har åtgärdat detta tidigare är att införa redundans i data. Med det första exemplet skulle vi lägga till en extra kolumn som heter lowerlastname och fyll i det med gemener lastname . Indexera sedan det för sökändamål och ditt select uttalanden blir bländande snabba, som de borde vara.

Och vad gör det med vår mycket älskade 3NF, hör jag dig fråga? Svaret är "inte mycket", om du vet vad du gör :-)

Du kan ställa in databasen så att den här nya kolumnen fylls i av en infogning/uppdateringsutlösare, för att bibehålla datakonsistens. Det är helt acceptabelt att bryta 3NF av prestationsskäl, förutsatt att du förstår och mildrar konsekvenserna.

På samma sätt kan den andra frågan ha en infognings-/uppdateringsutlösare som fyllde i en ny indexerad kolumn name_contains_comp närhelst en post uppdaterades eller infogades som innehöll relevant text.

Eftersom de flesta databaser läses mycket oftare än de skrivs, flyttar detta kostnaden för beräkningen till infogningen/uppdateringen, vilket effektivt amorterar den över alla utvalda operationer. Frågan blir då:

select name from customers where name_contains_comp = 'Y'

Återigen, du kommer att hitta frågan bländande snabb till den mindre kostnaden av något långsammare infogningar och uppdateringar.




  1. Hur lagrar man 1/01/1900 3:54:32 i MySQL?

  2. Slutför AJAX-samtal innan PayPal-knappen omdirigerar

  3. Det gick inte att ladda filen eller sammansättningen 'MySql.Data, Version=6.2.2.0

  4. PRAGMA table_list i SQLite