Rigorosamente importa solo la RAM?


4

Devo lavorare su un progetto che avrebbe una tabella extra large con miliardi di record ma solo due campi uno è id e un altro è testo.

E id sarebbe impostato su BIGINT e PK, quindi se 8 + 2 (extra 2 byte per overhead) byte per riga viene preso per indicizzare, allora nel mio calcolo 64 GB di RAM dovrebbe essere sufficiente per contenere almeno 5 miliardi di indici.

Ma è l'unico fattore che sto considerando.

Pensi che ci siano altri fattori che dovrei considerare?

E la dimensione della RAM può anche essere aumentata se necessario. E quella tabella sarebbe la tabella più occupata con poche scritture e molte letture.

+1

Posso chiedere un po 'più di informazioni su questo progetto?A cosa serve questo tavolo?Che problema stai cercando di risolvere? 15 set. 112011-09-15 07:14:14

3

È necessario considerare il motore di archiviazione che si utilizzerà per il progetto perché MySQL memorizza nella cache in modo diverso per ciascun motore di archiviazione.

MyISAM memorizza nella cache solo le pagine indice.InnoDB memorizza nella cache i dati e le pagine indice.

Dato che hai una tabella con ID grandi, spero che tu stia usando MyISAM.

Ecco una query per aiutarti a determinare il miglior key_buffer_size:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.4999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1))
recommended_key_buffer_size FROM
(SELECT LEAST(POWER(2,32),KBS1) KBS
FROM (SELECT SUM(index_length) KBS1
FROM information_schema.tables
WHERE engine='MyISAM' AND
table_schema NOT IN ('information_schema','mysql')) AA ) A,
(SELECT 2 PowerOf1024) B;

Questo darà l'impostazione raccomandata per MyISAM Key Cache (key_buffer_size) dato il tuo attuale set di dati (the query will cap the recommendation at 4G (4096M). per il sistema operativo a 32-bit, 4 GB è il limite. Per 64-bit, 8 GB.

AGGIORNAMENTO 2011-09-16 14:49 EDT

Se stai usando InnoDB, ridimensionare key_buffer_size non sarà di aiuto.InnoDB and MyISAM cache differently .

Ecco lo stesso tipo di query per dimensionare il pool di buffer InnoDB:

SELECT CONCAT(ROUND(KBS/POWER(1024,
IF(PowerOf1024<0,0,IF(PowerOf1024>3,0,PowerOf1024)))+0.49999),
SUBSTR(' KMG',IF(PowerOf1024<0,0,
IF(PowerOf1024>3,0,PowerOf1024))+1,1)) recommended_innodb_buffer_pool_size
FROM (SELECT SUM(data_length+index_length) KBS FROM information_schema.tables
WHERE engine='InnoDB') A,
(SELECT 2 PowerOf1024) B;
  0

È interessante notare che sto pensando di usare InnoDB perché funziona meglio sotto carico.Quindi, quello che ho imparato dalla tua risposta è che finché c'è abbastanza cache delle chiavi.La dimensione del DB non ha importanza? 16 set. 112011-09-16 16:56:43

  0

Ho aggiornato la mia risposta all'indirizzo usando InnoDB 16 set. 112011-09-16 18:49:40

  0

Ma come hai detto che il limite massimo è di 8 GB per MyISAM, allora significa che oltre le risorse RAM non verranno utilizzate in modo efficiente?{Scusa se ho fatto questa domanda troppo tardi ..} 01 ott. 112011-10-01 22:14:09

+1

@Gary: hai ragione.La memoria allocata sopra 8 GB per key_buffer_size è sprecata.Questo è fondamentale poiché solo le pagine indice sono memorizzate nella cache per MyISAM.È possibile creare cache chiave dedicate a specifiche tabelle MyISAM: http://dev.mysql.com/doc/refman/5.5/en/cache-index.html 01 ott. 112011-10-01 22:41:42