Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Od jakiegoś czasu używam MySQL na lokalnym komputerze do obrabiania danych do późniejszych analiz statystycznych. MySQL używam od niedawna i o ile opanowałem już w miarę pisanie kwerend to administrowanie serwerem to dla mnie jeszcze czarna magia.

Chciałbym wiedzieć, jakie są możliwości zoptymalizowania serwera do mojego trybu pracy, która charakteryzuje się (nie wiem na ile to wszystko ma znaczenie):

1. Serwer MySQL wykorzystywany jest tylko lokalnie (na tej samej maszynie). Żadnych połączeń zdalnych.

2. Maszyna: AMD Athlon II X4 630, 8gb RAM, Ubuntu 10.4 64-bit.

3. Bazy danych nie są bardzo wielkie. Przeważnie: kilka/kilkanaście tabel, największe tabele mają max kilkaset tysięcy rekordów.

4. Dużo rzeczy robię widokami, z których soft statystyczny wciąga dane do analizy (czy widoki można jakoś cachować?)

To chyba tyle informacji, które wydały mi się istotne. Uzupełnię jak będzie potrzeba.

Będę wdzięczny za poradę.

konto usunięte

Temat: tuning serwera mysql

Jak bawisz się data miningiem to za dużo administracja ci nie pomoże... Ja JAVOWym apriori zabijałem komputer na godzinę 2k rekordów ;-) Nowsze wersje mySQL wspierają partycje, to ci się może przydać... ale... jedyne co mi przychodzi do głowy przy obliczeniach http://dev.mysql.com/doc/refman/5.0/en/memory-storage-... co raczej będzie wymagać jakiegoś skryptu po starcie instancji DB, w którym pobierzesz wszystkie tabele z określonego schematu ( z inforationSchema ) i zrobisz ich kopię.


create table foo_dyn engine=MEMORY as SELECT * FROM foo
Rafał Wardas edytował(a) ten post dnia 25.03.11 o godzinie 23:12
Michał Gruchała

Michał Gruchała Skalowalność,
wydajność,
niezawodność

Temat: tuning serwera mysql

To chyba tyle informacji, które wydały mi się istotne. Uzupełnię jak będzie potrzeba.

Może czas na hadoopa? :D

Pokaż prosze przykładowe zapytania, bo kilkaset k rekordów, to nie jest dużo - masz 8GB RAMu (MySQL lubi ram)
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Dzięki za podpowiedzi

@Rafał
Dzięki za engine=MEMORY, nie wiedziałem, że coś takiego istnieje. Muszę się temu przyjrzeć. Natomiast, co to są partycje (bo jak rozumiem nie chodzi o dyskowe).

@Michał
Do hadoopa jeszcze daleko. Przykładowe zapytanie:

Dane dotyczą aliansów strategicznych pomiędzy firmami. Tabela 'el' zawiera dane o aliansach: kolumny ego i alt zawieraja id firm-partnerow w danym aliansie, pozostale to atrybuty aliansu. W joinach dolaczam dane o firmach (sektor gospodarki) oraz, w ostatnim, atrybuty aliansu z jeszcze innej tabeli.


create table edgelist_us_bilateral as
select distinct el.jvdealno, el.ego, el.alt, year(el.da) as rok, ad.rds as rnd, ad.mnf as mnf, ad.mrk as mrk
from v_edgelist as el
left join firma_pnatc as fp1 on el.ego=fp1.firma_id
left join firma_pnatc as fp2 on el.alt=fp2.firma_id
left join v_activity_rds_mnf_mrk as ad on el.jvdealno=ad.jvdealno
where fp1.pnatc="US"
and fp2.pnatc="US"
group by el.jvdealno
having count(el.jvdealno) = 1;

konto usunięte

Temat: tuning serwera mysql

pojęcie indeksów jest ci znane?

co do tabel typu MEMORY - bez zbędnej podniety

standardowo jest: The maximum size of MEMORY tables is limited by the max_heap_table_size system variable, which has a default value of 16MB. To have larger (or smaller) MEMORY tables, you must change the value of this variable. The value co może mocno ograniczać
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Przemysław R.:
pojęcie indeksów jest ci znane?

Znane. W każdym razie wszystkie tabele mają zdefiniowane indeksy na kolumnach, na których robię joiny/selecty.
co do tabel typu MEMORY - bez zbędnej podniety

standardowo jest: The maximum size of MEMORY tables is limited by the max_heap_table_size system variable, which has a default value of 16MB. To have larger (or smaller) MEMORY tables, you must change the value of this variable. The value co może mocno ograniczać

OK, dobrze wiedzieć. Choć pewnie jak zwiększyłbym max_heap_table_size do np 1 czy 2 gb to rozwiązuje to problem (?).
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Czy MySQL korzysta z wielu rdzeni? Zauważyłem, że gdy uruchamiam kwerendę to tylko jeden z rdzeni jest wkorzystywany. Pewnie mógłbym zalogować się jednocześnie w oddzielnej sesji i uruchomić inna kwerende równolegle wtedy każda sesja by szła na innym wątku i rdzeniu, czyż nie? Pytanie, czy w pojedynczej sesji można zrobić tak, żeby wykorzystywany był więcej niż jeden rdzeń?
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Rafał Wardas:
Nowsze wersje mySQL wspierają partycje, to ci się może przydać

OK, poczytałem i rozumiem o co chodzi w partycjach. Dzięki. Może się przydać, tylko muszę się zastanowić czy istnieje sensowny sposób podziału niektórych tabel.
Maciej S.

Maciej S. System/Network
Administrator

Temat: tuning serwera mysql

Przemysław R.:
pojęcie indeksów jest ci znane?

co do tabel typu MEMORY - bez zbędnej podniety

standardowo jest: The maximum size of MEMORY tables is limited by the max_heap_table_size system variable, which has a default value of 16MB. To have larger (or smaller) MEMORY tables, you must change the value of this variable. The value co może mocno ograniczać

A jaki problem w tym, żeby w sesji w której tworzysz i zapełniasz taką tabelę ustawić większy limit (oczywiście mając na względzie architekturę i386/amd64)? ...na przykład 2GB:

SET SESSION tmp_table_size=2*1024*1024*1024;
SET SESSION max_heap_table_size=2*1024*1024*1024;
Maciej S. edytował(a) ten post dnia 28.03.11 o godzinie 10:59
Maciej S.

Maciej S. System/Network
Administrator

Temat: tuning serwera mysql

Michał Bojanowski:

OK, dobrze wiedzieć. Choć pewnie jak zwiększyłbym max_heap_table_size do np 1 czy 2 gb to rozwiązuje to problem (?).

Globalnie to raczej bym tego nie ustawiał...
Michał Gruchała

Michał Gruchała Skalowalność,
wydajność,
niezawodność

Temat: tuning serwera mysql

Michał Bojanowski:
Czy MySQL korzysta z wielu rdzeni? Zauważyłem, że gdy

afair jedno zapytanie == jeden rdzeń (nawet jeden thread == jeden rdzeń)
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Dziękuje wszystkim za dotychczasowe sugestie. Wypróbuję tabele MEMORY i zobaczę czy w mojej bazie jest sens podzielenia niektórych tabel na partycje.

Chciałem jeszcze dopytać o jedną rzecz. Czy istnieje coś takiego jak cache'owanie widoków? (albo coś co jest funkcjonalnie równoważne). Chodzi mi o dynamicznie tworzoną tabelę na podstawie innych tabel (czyli jak widok) z tym, że żeby nie była ona odtwarzana za każdym razem od zera, ale tylko gdy któraś z tabel "wejściowych" zostanie zmieniona. Coś jak make, który builduje tylko te kawałki, dla których zmieniły się źródła.

Przykładowa kwerenda, którą wkleiłem wcześniej zajmuje parę minut. To trochę dużo jak na moje potrzeby więc zamiast widoku zapisałem ją sobie jako normalną tabele, żeby była szybciej wczytywana przez soft analityczny. Gdy cokolwiek zmieniam w tabelach źródłowych, lub gdzieś po drodze ręcznie kopiuje widok "ręcznie" do normalnej tabeli, co koniec końców "kills the purpose" widoków jako takich...

Jakieś sugestie?Michał Bojanowski edytował(a) ten post dnia 28.03.11 o godzinie 19:08
Michał Gruchała

Michał Gruchała Skalowalność,
wydajność,
niezawodność

Temat: tuning serwera mysql

Michał Bojanowski:

create table edgelist_us_bilateral as
select distinct el.jvdealno, el.ego, el.alt, year(el.da) as rok, ad.rds as rnd, ad.mnf as mnf, ad.mrk as mrk
from v_edgelist as el
left join firma_pnatc as fp1 on el.ego=fp1.firma_id
left join firma_pnatc as fp2 on el.alt=fp2.firma_id
left join v_activity_rds_mnf_mrk as ad on el.jvdealno=ad.jvdealno
where fp1.pnatc="US"
and fp2.pnatc="US"
group by el.jvdealno
having count(el.jvdealno) = 1;

Zle napisałem, wklej prosze explain select...
MySQL Ci powie czemu by to zapytanie zrobił tak a nie inaczej.
Jeśli chodzi o to cacheowanie widoków, to chyba szukasz tak zwanego widoku zmaterializowanego (ale nie wiem czy MySQL to ma;/)
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

nie wiem jak to wkleic zeby bylo czytelnie, chyba pionowo lepiej

explain select distinct el.jvdealno, el.ego, el.alt, year(el.da) as rok, ad.rds as rnd, ad.mnf as mnf, ad.mrk as mrk from v_edgelist as el left join firma_pnatc as fp1 on el.ego=fp1.firma_id left join firma_pnatc as fp2 on el.alt=fp2.firma_id left join v_activity_rds_mnf_mrk as ad on el.jvdealno=ad.jvdealno where fp1.pnatc="US" and fp2.pnatc="US" group by el.jvdealno having count(el.jvdealno) = 1 \G
*************************** 1. row ***************************
id: 1
select_type: PRIMARY
table: af1
type: ALL
possible_keys: jvdealno,firma_id
key: NULL
key_len: NULL
ref: NULL
rows: 235479
Extra: Using temporary; Using filesort
*************************** 2. row ***************************
id: 1
select_type: PRIMARY
table: fp1
type: ref
possible_keys: firma_id_2,firma_id
key: firma_id_2
key_len: 4
ref: thomson.af1.firma_id
rows: 1
Extra: Using where; Using index
*************************** 3. row ***************************
id: 1
select_type: PRIMARY
table: a
type: eq_ref
possible_keys: PRIMARY,jvdealno
key: PRIMARY
key_len: 8
ref: thomson.af1.jvdealno
rows: 1
Extra:
*************************** 4. row ***************************
id: 1
select_type: PRIMARY
table: af2
type: ref
possible_keys: jvdealno,firma_id
key: jvdealno
key_len: 9
ref: thomson.af1.jvdealno
rows: 1
Extra: Using where
*************************** 5. row ***************************
id: 1
select_type: PRIMARY
table: fp2
type: ref
possible_keys: firma_id_2,firma_id
key: firma_id_2
key_len: 4
ref: thomson.af2.firma_id
rows: 1
Extra: Using where; Using index
*************************** 6. row ***************************
id: 1
select_type: PRIMARY
table: <derived3>
type: ALL
possible_keys: NULL
key: NULL
key_len: NULL
ref: NULL
rows: 102513
Extra:
*************************** 7. row ***************************
id: 3
select_type: DERIVED
table: aa
type: index
possible_keys: NULL
key: jvdealno
key_len: 9
ref: NULL
rows: 152210
Extra:
7 rows in set (0.55 sec)

Michał Bojanowski edytował(a) ten post dnia 29.03.11 o godzinie 14:35Michał Bojanowski edytował(a) ten post dnia 29.03.11 o godzinie 14:43
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Jeśli chodzi o to cacheowanie widoków, to chyba szukasz tak zwanego widoku zmaterializowanego (ale nie wiem czy MySQL to ma;/)

Z tego co doczytałem to rzeczywiście nie ma materialized views w MySQL, można je za to "emulować". Automatyzując proces, który sam robiłem ręcznie: regularne zapisywanie widoku jako normalnej tabeli. Można poczytać tutaj http://dev.mysql.com/doc/refman/5.0/en/create-view.html końcowe posty, wystarczy wyszukać "Simulating Materialized View".

konto usunięte

Temat: tuning serwera mysql

Wrzuć to w event :
http://dev.mysql.com/tech-resources/articles/mysql-eve...
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Rafał Wardas:
Wrzuć to w event :
http://dev.mysql.com/tech-resources/articles/mysql-eve...

Słusznie, to chyba lepsze niż CRON...
Dzięki
Mariusz Sucajtys

Mariusz Sucajtys Wszyscy wiedzą, że
czegoś nie da się
zrobić, aż znajdzie
...

Temat: tuning serwera mysql

Michał Bojanowski:
Chciałem jeszcze dopytać o jedną rzecz. Czy istnieje coś takiego jak cache'owanie widoków? (albo coś co jest funkcjonalnie równoważne).

Na MySQL Performance Blog pojawiły się ostatnio artykuły o Frexviews:
* part 1
* part 2Mariusz Sucajtys edytował(a) ten post dnia 30.03.11 o godzinie 07:27
Michał Bojanowski

Michał Bojanowski socjolog, analityk

Temat: tuning serwera mysql

Mariusz Sucajtys:
Na MySQL Performance Blog pojawiły się ostatnio artykuły o Frexviews:


Świetne. Dzięki.
Mariusz Sucajtys

Mariusz Sucajtys Wszyscy wiedzą, że
czegoś nie da się
zrobić, aż znajdzie
...

Temat: tuning serwera mysql

Michał Bojanowski:
3. Bazy danych nie są bardzo wielkie. Przeważnie: kilka/kilkanaście tabel, największe tabele mają max kilkaset tysięcy rekordów.
1. A może trochę więcej szczegółów? Tutaj masz 2 skrypty, które umożliwiają policzenie, ile masz danych.
2. Jak często dane są aktualizowane? Jak duży wolumen aktualizacji? Czy dane są nadpisywane, czy dopisywane?
3. Jakie masz ustawienia MySQL? Wrzuć wynik SHOW GLOBAL VARIABLES. Może coś mądrego uda się wymyślić?

Następna dyskusja:

Szybkie odpytywanie zdalneg...




Wyślij zaproszenie do