PDA

View Full Version : [database] Tabella con Milioni di righe e ForeignKey


CercoAiutoo
12-01-2010, 18:35
Ho una tabella "libri" con i campi "Titolo" e "Descrizione" che ha 4 milioni di righe.


Per evitare di interrogare una tabella di 4 milioni di righe ho pensato di dividerla per argomento ( 20 tabelle da circa 200mila righe ( libro_giallo, libro_horror, ecc )).

Nella tabella "lettori" quindi pensavo di inserire i seguenti campi:

nome_lettore ( varchar )
libro_argomento ( int )
libro_id ( int )


Quindi invece della ForeignKey, uso degli integer "libro_argomento" ( che mi permette di accedere alla opportuna tabella ) e "libro_id" ( che mi permettere di accedere al libro della tabella specificata in "libro_argomento" ).


Dite che è una buona soluzione NON usare i ForeignKey ed evitare di interrogare sempre una tabella da 4 milioni di righe ?

Mixmar
12-01-2010, 20:35
Non sono un grande esperto di database, quindi un paio di considerazioni niente affatto specifiche:


L'aumento di efficienza della tua soluzione (20 tabelle più piccole anzichè una sola) si basa sull'ipotesi che lo stesso lettore tenda a preferire libri dello stesso genere: troppi lettori "onnivori" ti costringerebbero a interrogare comunque l'unione di tutte le tabelle che hai creato.
E' vero, non utilizzare la clausola di integrità referenziale probabilmente velocizza le operazioni del database, ma rallenterà il tuo software perchè devi implementarla "a mano" (che succede, se elimini un libro dall'elenco, ai record collegati)? Anche qui, spero che tu abbia controllato che i costi non superino i benefici. Ovviamente, il costo di una JOIN, con o senza la Foreign Key, è identico: anzi, tu devi prima fare un test per individuare la tabella dei libri su cui eseguire la query.
Per una questione di nomi, magari chiamerei la seconda tabella "letture" e non "lettori", in quanto in effetti ogni riga identifica un libro letto da una certa persona, non un (solo) lettore specifico.

wizard1993
12-01-2010, 20:38
inoltre a mio avviso, un database un minimo ottimizzato, eventualmente creando un semplice indice sul capo argomento, crea automaticamente una struttura come quella da te descritta dietro le quinte

CercoAiutoo
12-01-2010, 20:50
Scusate ho dimenticato di dire che su questa/e tabella/e verrà fatta un solo tipo di query tramite ajax con un campo di autocompletamento come Google Suggest.
La query è questa:

SELECT * FROM libri WHERE libro_titolo LIKE '.$q.'% LIMIT 100


Inoltre volevo dire che uso già l' indice sul campo libro_titolo e la tabella libri non verrà MAI modificata ( niente inserimenti e niente cancellazioni ne ora ne mai se non mooolto raramente ).


.

cdimauro
13-01-2010, 06:56
L'integrità referenziale appesantisce le operazioni di insert, update e delete, ma non quelle di select, per cui puoi benissimo utilizzarla ed evitare di usare 20 tabelle diverse che, a mio avviso, non risolvono il tuo problema.

shinya
13-01-2010, 08:57
Scusate ho dimenticato di dire che su questa/e tabella/e verrà fatta un solo tipo di query tramite ajax con un campo di autocompletamento come Google Suggest.
La query è questa:

SELECT * FROM libri WHERE libro_titolo LIKE '.$q.'% LIMIT 100

.
Non vedo l'ora di cercare il mio libro preferito: "foobar'; drop table libri; --"

4 milioni di righe non mi sembrano tantissime, se accedi per indice... ma la query è effettivamente lenta o è una tua supposizione?

CercoAiutoo
13-01-2010, 11:54
La query non so se è lenta... la sto provando sul mio computer e phpmyadmin mi dice che ci impiega 0.0010 secondi circa :stordita:

marco.r
13-01-2010, 12:42
Non vedo l'ora di cercare il mio libro preferito: "foobar'; drop table libri; --"

Mi ricorda qualcosa ...

http://imgs.xkcd.com/comics/exploits_of_a_mom.png


4 milioni di righe non mi sembrano tantissime, se accedi per indice... ma la query è effettivamente lenta o è una tua supposizione?

Infatti non dovrebbe essere molto lenta, una ottimizzazione del genere aspetterei di avere dei dati dai dei test sotto carico.

shinya
13-01-2010, 13:37
Mi ricorda qualcosa ...
Eh si infatti, mitico Little Bobby Tables! :D

wizard1993
13-01-2010, 16:24
scusate l'ot
ma queste strisce dove le trovate?

shinya
13-01-2010, 16:50
scusate l'ot
ma queste strisce dove le trovate?
http://xkcd.com/