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

Qual è un buon modo per denormalizzare un database MySQL?

So di più su mssql che su mysql, ma non penso che il numero di join o il numero di righe di cui stai parlando dovrebbe causarti troppi problemi con gli indici corretti in atto. Hai analizzato il piano di query per vedere se ne manca qualcuno?

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

Detto questo, una volta che sei soddisfatto dei tuoi indici e hai esaurito tutte le altre strade, la denormalizzazione potrebbe essere la risposta giusta. Se hai solo una o due query problematiche, è probabilmente appropriato un approccio manuale, mentre una sorta di strumento di data warehousing potrebbe essere migliore per creare una piattaforma per sviluppare cubi di dati.

Ecco un sito che ho trovato che tocca l'argomento:

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

Ecco una semplice tecnica che puoi utilizzare per mantenere semplice la denormalizzazione delle query, se ne stai facendo solo alcune alla volta (e non sto sostituendo le tue tabelle OLTP, ma ne creo una nuova a scopo di reporting). Supponiamo che tu abbia questa query nella tua applicazione:

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

Potresti creare una tabella denormalizzata e popolare con quasi la stessa query:

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

Nota che i caratteri di sottolineatura corrispondono agli alias di tabella che utilizzi

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

Quindi, per correggere la tua app in modo che utilizzi la nuova tabella denormalizzata, cambia i punti per i trattini bassi.

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

Per query di grandi dimensioni questo può far risparmiare molto tempo e chiarire da dove provengono i dati e puoi riutilizzare le query che hai già.

Ricorda, sto sostenendo questo solo come ultima risorsa. Scommetto che ci sono alcuni indici che ti potrebbero aiutare. E quando denormalizzi, non dimenticare di tenere conto dello spazio extra sui tuoi dischi e di capire quando eseguirai la query per popolare le nuove tabelle. Questo dovrebbe essere probabilmente di notte o ogni volta che l'attività è bassa. E i dati in quella tabella, ovviamente, non saranno mai esattamente aggiornati.

[Ancora un'altra modifica] Non dimenticare che anche le nuove tabelle che crei devono essere indicizzate! La parte buona è che puoi indicizzare a tuo piacimento e non preoccuparti della contesa del blocco degli aggiornamenti, poiché a parte il tuo inserimento collettivo, la tabella vedrà solo le selezioni.