Próbuję uzyskać lepsze informacje na temat szybkości wstawiania i wzorców wydajności w mysql dla niestandardowego produktu. Mam dwie tabele, do których ciągle dołączam nowe wiersze. Te dwie tabele są zdefiniowane następująco:Spowolnienie prędkości wstawiania w miarę wzrostu tabeli w mysql
CREATE TABLE events (
added_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
id BINARY(16) NOT NULL,
body MEDIUMBLOB,
UNIQUE KEY (id)) ENGINE InnoDB;
CREATE TABLE index_fpid (
fpid VARCHAR(255) NOT NULL,
event_id BINARY(16) NOT NULL UNIQUE,
PRIMARY KEY (fpid, event_id)) ENGINE InnoDB;
I zachować wstawianie nowych obiektów do obu tabel (dla każdego nowego obiektu, wstawić odpowiednie informacje do obu tabel w jednej transakcji). Na początku dostaję około 600 wstawień/sekundę, ale po ~ 30000 rzędach dostaję znaczne spowolnienie (około 200 wstawień/s), a następnie spowolnienie, ale nadal zauważalne spowolnienie.
Widzę, że wraz z rosnącą tabelą liczba oczekujących na IO jest coraz wyższa. Moją pierwszą myślą była pamięć pobrana przez indeks, ale te są wykonywane na maszynie wirtualnej, która ma 768 Mb i jest przeznaczona wyłącznie do tego zadania (2/3 pamięci nie jest używana). Ponadto trudno jest zobaczyć 30000 wierszy zajmujących tak dużo pamięci, a nawet więcej, tylko indeksy (cały katalog danych mysql < 100 Mb). Aby to potwierdzić, przydzieliłem bardzo mało pamięci do maszyny wirtualnej (64 Mb), a wzór spowolnienia jest prawie identyczny (tj. Spowolnienie pojawia się po tej samej liczbie wstawień), więc podejrzewam pewne problemy z konfiguracją, zwłaszcza, że jestem stosunkowo nowy bazy danych.
Wzór wygląda następująco:
mam samodzielne Pythona skrypt, który odtwarza ten problem, że mogę udostępnić jeśli to pomocne.
Konfiguracja:
- Ubuntu 10.04, 32 bity działające na KVM, 760 Mb przypisane do niego.
- Mysql 5.1 z konfiguracją skrzynki z oddzielnych plików dla tabel
[EDIT]
Dziękuję bardzo Eric Holmberg, że się udało. Oto wykresy po naprawieniu wartości innodb_buffer_pool_size do rozsądnej wartości:
Problem z możliwością zapisu na dysku wirtualnym lub innym. –
Nie jestem pewien, czy rozumiem, co masz na myśli: Rozumiem, że potrzeba czasu na zapisanie na dysku, ale to nie wyjaśnia spowolnienia w miarę wzrostu tabeli. –