Estou trabalhando em um aplicativo que envolve muitas gravações de banco de dados, aproximadamente ~ 70% inserções e 30% leituras. Essa proporção também incluiria atualizações que considero uma leitura e uma gravação. Através de instruções de inserção, vários clientes inserem dados no banco de dados através da instrução de inserção abaixo:
$mysqli->prepare("INSERT INTO `track` (user, uniq_name, ad_name, ad_delay_time ) values (?, ?, ?, ?)");
A questão é se devo usar o insert_delay ou o mecanismo mysqli_multi_query porque a instrução insert utiliza ~ 100% da CPU no servidor. Estou usando o mecanismo InnoDB no meu banco de dados, portanto, a inserção com atraso não é possível. A inserção no servidor é ~ 36k / h e 99,89% de leitura, também estou usando a instrução select, recupera os dados sete vezes em uma única consulta , essa consulta leva 150 segundos no servidor para executar. Que tipo de técnica ou mecanismo posso usar para esta tarefa? A memória do meu servidor é de 2 GB, devo expandir a memória ?. Dê uma olhada neste problema, qualquer sugestão será grata a mim.
Estrutura da tabela:
+-----------------+--------------+------+-----+-------------------+----------------+
| 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 | |
+-----------------+--------------+------+-----+-------------------+----------------+
O status atual do meu banco de dados mostra 41k inserções (gravações), o que é muito lento para o meu banco de dados.
SHOW FULL PROCESSLIST
quando estiver usando 100% da CPU? Quantas conexões você está permitindo e quantas são feitas durante esse período?
SHOW GLOBAL VARIABLES LIKE 'innodb%';
e SELECT VERSION();
e exibir sua saída.