Sto lavorando a un'applicazione che coinvolge molte scritture di database, circa il 70% di inserti e il 30% di letture. Questo rapporto includerebbe anche gli aggiornamenti che considero una lettura e una scrittura. Tramite le istruzioni insert più client inseriscono i dati nel database tramite le istruzioni insert seguenti:
$mysqli->prepare("INSERT INTO `track` (user, uniq_name, ad_name, ad_delay_time ) values (?, ?, ?, ?)");
La domanda è: dovrei usare insert_delay o usare il meccanismo mysqli_multi_query perché l'istruzione insert utilizza ~ 100% cpu sul server. Sto usando il motore InnoDB sul mio database, quindi non è possibile inserire ritardi. L'inserimento sul server è ~ 36k / h e il 99,89% letto, inoltre sto usando l'istruzione select per recuperare i dati sette volte in una singola query , questa query impiega 150 secondi per l'esecuzione sul server. Che tipo di tecnica o meccanismo posso usare per questo compito? La memoria del mio server è di 2 GB, devo espandere la memoria ?. Dai un'occhiata a questo problema, qualsiasi suggerimento mi sarà grato.
Struttura del tavolo:
+-----------------+--------------+------+-----+-------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-----------------+--------------+------+-----+-------------------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| user | varchar(100) | NO | | NULL | |
| uniq_name | varchar(200) | NO | | NULL | |
| ad_name | varchar(200) | NO | | NULL | |
| ad_delay_time | int(11) | NO | | NULL | |
| track_time | timestamp | NO | MUL | CURRENT_TIMESTAMP | |
+-----------------+--------------+------+-----+-------------------+----------------+
Il mio database presenta lo stato, mostra 41k inserimenti (scritture), che è molto lento per il mio database.
SHOW FULL PROCESSLIST
quando sta prendendo il 100% di CPU? Quante connessioni stai permettendo vs quante sono state prese in questo periodo?
SHOW GLOBAL VARIABLES LIKE 'innodb%';
ed SELECT VERSION();
e mostrare la loro uscita.