Pracuję nad aplikacją, która wymaga dużo zapisów do bazy danych, około 70% wstawek i 30% odczytów. Ten stosunek obejmuje także aktualizacje, które uważam za jeden odczyt i jeden zapis. Poprzez instrukcje wstawiania wielu klientów wstawia dane do bazy danych za pomocą instrukcji insert poniżej:
$mysqli->prepare("INSERT INTO `track` (user, uniq_name, ad_name, ad_delay_time ) values (?, ?, ?, ?)");
Pytanie brzmi: czy powinienem użyć albo insert_delay, czy też mechanizmu mysqli_multi_query , ponieważ instrukcja insert wykorzystuje ~ 100% procesora na serwerze. Korzystam z silnika InnoDB w mojej bazie danych, więc wstawianie z opóźnieniem nie jest możliwe. Wstawienie na serwerze wynosi ~ 36k / h i odczyt 99,89%, również używam instrukcji select, aby pobrać dane siedem razy w pojedynczym zapytaniu , wykonanie tego zapytania zajmuje 150 sekund na serwerze. Jakiej techniki lub mechanizmu mogę użyć do tego zadania? Moja pamięć serwera to 2 GB, czy powinienem rozszerzyć pamięć ?. Spójrz na ten problem, wszelkie sugestie będą mi wdzięczne.
Struktura stołu:
+-----------------+--------------+------+-----+-------------------+----------------+
| 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 | |
+-----------------+--------------+------+-----+-------------------+----------------+
Obecny stan mojej bazy danych pokazuje 41k wstawień (zapisów), co jest bardzo wolne dla mojej bazy danych.
SHOW FULL PROCESSLIST
gdy wymaga on 100% procesora? Ile połączeń zezwalasz na liczbę połączeń w tym czasie?
SHOW GLOBAL VARIABLES LIKE 'innodb%';
a SELECT VERSION();
i wyświetlić ich produkcji.