sql >> Databasteknik >  >> RDS >> Mysql

Vad är ett bra sätt att denormalisera en mysql-databas?

Jag vet mer om mssql än mysql, men jag tror inte att antalet joins eller antalet rader du pratar om borde orsaka dig för många problem med rätt index på plats. Har du analyserat frågeplanen för att se om du saknar någon?

http://dev.mysql.com/doc/refman/5.0 /en/explain.html

Med det sagt, när du väl är nöjd med dina index och har uttömt alla andra vägar, kan avnormalisering vara det rätta svaret. Om du bara har en eller två frågor som är problem, är ett manuellt tillvägagångssätt förmodligen lämpligt, medan något slags datalagerverktyg kan vara bättre för att skapa en plattform för att utveckla datakuber.

Här är en sida jag hittade som berör ämnet:

http://www.meansandends.com /mysql-data-warehouse/?link_body%2Fbody=%7Bincl%3AAggregation%7D

Här är en enkel teknik som du kan använda för att hålla denormaliseringsfrågor enkel, om du bara gör några åt gången (och jag ersätter inte dina OLTP-tabeller, utan skapar bara en ny för rapporteringsändamål). Låt oss säga att du har den här frågan i din ansökan:

select a.name, b.address from tbla a 
join tblb b on b.fk_a_id = a.id where a.id=1

Du kan skapa en denormaliserad tabell och fylla med nästan samma fråga:

create table tbl_ab (a_id, a_name, b_address); 
-- (types elided)

Lägg märke till att understrecket matchar de tabellalias du använder

insert tbl_ab select a.id, a.name, b.address from tbla a
join tblb b on b.fk_a_id = a.id 
-- no where clause because you want everything

För att sedan fixa din app att använda den nya denormaliserade tabellen byter du prickarna mot understreck.

select a_name as name, b_address as address 
from tbl_ab where a_id = 1;

För stora frågor kan detta spara mycket tid och göra det tydligt var data kommer ifrån, och du kan återanvända de frågor du redan har.

Kom ihåg att jag bara förespråkar detta som den sista utvägen. Jag slår vad om att det finns några index som skulle hjälpa dig. Och när du avnormaliserar, glöm inte att ta hänsyn till det extra utrymmet på dina diskar och ta reda på när du kommer att köra frågan för att fylla i de nya tabellerna. Detta bör förmodligen vara på natten, eller när aktiviteten är låg. Och uppgifterna i den tabellen kommer naturligtvis aldrig att vara exakt uppdaterade.

[Ännu en redigering] Glöm inte att de nya tabellerna du skapar också måste indexeras! Den goda delen är att du kan indexera till ditt hjärta och inte oroa dig för uppdateringslås, eftersom förutom din bulkinfogning bara kommer att se utvalda tabeller.



  1. Databasdesign för appar med hashtags

  2. Saknar mysql.h och försöker hitta mysql-devel

  3. Beräkna delta (skillnaden mellan nuvarande och föregående rad) i sql

  4. Varför får jag hela tiden ett 500-fel med min PHP?