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

Hvad er en god måde at denormalisere en mysql-database på?

Jeg ved mere om mssql end mysql, men jeg tror ikke, at antallet af joinforbindelser eller antallet af rækker, du taler om, burde give dig for mange problemer med de korrekte indekser på plads. Har du analyseret forespørgselsplanen for at se, om du mangler nogen?

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

Når det er sagt, så snart du er tilfreds med dine indekser og har udtømt alle andre veje, kan de-normalisering være det rigtige svar. Hvis du bare har en eller to forespørgsler, der er problemer, er en manuel tilgang sandsynligvis passende, hvorimod en form for data warehousing-værktøj kan være bedre til at skabe en platform til at udvikle datakuber.

Her er et websted, jeg fandt, der berører emnet:

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

Her er en simpel teknik, som du kan bruge til at holde denormaliseringsforespørgsler enkel, hvis du bare laver nogle få ad gangen (og jeg erstatter ikke dine OLTP-tabeller, bare opretter en ny til rapporteringsformål). Lad os sige, at du har denne forespørgsel i din ansøgning:

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

Du kan oprette en denormaliseret tabel og udfylde med næsten den samme forespørgsel:

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

Bemærk, at understregningerne matcher de tabelaliasser, du bruger

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

For derefter at rette din app til at bruge den nye denormaliserede tabel, skal du skifte prikkerne til understregninger.

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

For store forespørgsler kan dette spare en masse tid og gør det klart, hvor dataene kom fra, og du kan genbruge de forespørgsler, du allerede har.

Husk, at jeg kun anbefaler dette som sidste udvej. Jeg vil vædde på, at der er et par indekser, der vil hjælpe dig. Og når du denormaliserer, så glem ikke at tage højde for den ekstra plads på dine diske og regne ud, hvornår du vil køre forespørgslen for at udfylde de nye tabeller. Dette bør sandsynligvis være om natten, eller når aktiviteten er lav. Og dataene i den tabel vil selvfølgelig aldrig være helt opdateret.

[Endnu en redigering] Glem ikke, at de nye tabeller, du opretter, også skal indekseres! Den gode del er, at du kan indeksere efter dit hjertes indhold og ikke bekymre dig om opdateringslåsestridigheder, da bortset fra din masseindsættelse vil tabellen kun se udvalgte.



  1. Hvordan man øger en tæller og returnerer værdien i MySQL

  2. Er en SQL-injektion faktisk mulig ved at tilføje en anden forespørgsel?

  3. Hvordan får man ASCII-værdi i Oracle?

  4. Overvågning af brugte forbindelser på mysql for at fejlsøge 'for mange forbindelser'