Skocz do zawartości
Zaloguj się, aby obserwować  
MrLei

Mysql - tworzenie tabeli z selecta.

Polecane posty

Mam problem z bazą mysql'a gdy tworze nową tabele z selecta innych 3 tabel.

Czas genrowanie tej tabeli jest dla mnie do zaakceptowania. Problem dotyczy blokowanie całej bazy w tym czasie, 1,5 minuty cała baza "zwisa" , stoi i czeka aż sie ten proces zakończy. Tabele mam myisam.

 

Czy to poblem tabel myisam? przy innodB było by tak samo?

 

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

 

pocztałem zmieniłem na innodb .. i to samo.

 

http://www.percona.com/blog/2006/07/12/insert-into-select-performance-with-innodb-tables/

 

 

PS. A może brakuje Ci np. indeksów albo zapytanie może być lepiej zbudowane i dlatego zapytanie tak długo trwa?

Edytowano przez xorg (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Problem nie jest długości zapytania tylko to że jeden select który tworzy tabele blokuje cała baze.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Nie laduj danych na zasadzie insert info select from. Takie zapytania zawsze blokują tabelę. Jeżeli koniecznie musisz ładować dane w ten sposób, zastanów się nad stworzeniem widoku lub pomogę znaleźć ci inne rozwiązanie

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Zresztą 1.5 minuty to i tak długo.jakie dokładnie zapytania tworzysz? Ile danych jest przerzucane?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Jest kilka możliwości.

 

Możliwością samego SQLa jest tworzenie widoków.

 

Możliwością MySQLa jest użycie np. mysqldump'a, który robiąc kopię całej bazy (pliku), czy nawet pojedynczych tabel, działa o wiele szybciej niż robienie tego samego SQLem.

 

Za to najlepiej wyjdziesz jak zlokalizujesz bottlenecka. Najczęściej jest to I/O, w tym celu o wiele lepiej puścić mysqldumpa przez pipe'a do gzipa (mysqldump -h localhost ... | gzip > mojabza.sql.gz), bo oszczędzasz bardzo dużo danych, które musisz zapisać na dysk. W przypadku CPU, pomóc może założenie lepszych indeksów, dotweakowanie zmiennych serwera MySQL, i wiele innych rzeczy.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dokładnie tak jak mówi Archi. Sprawdź też strukturę bazy - jeżeli potrzebujesz danych składowych z trzech innych tabel może się okazać, że logika którą podjales jest bez sensu. Być może w ogóle nie potrzebujesz czwartej tabeli.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Patrzę na Wasze wiadomości i zastanawiam się czemu tutaj poziom tak bardzo leży.

 

Porobiłem sobie testy na koncie hostingowym i zrobiłem bazę, zapytanie optymalne, ale dużo danych. Baza zanim przemieliła z kilku tabel to po prostu chwilę pomyślała. Czy nie możecie zrozumieć, że autor ma:

- dobrą strukturę

- dobre zapytanie

- szybki serwer

?

 

Autor nie pyta o to jak zoptymalizować bazę, tylko o techniczne ograniczenia takiego zapytania.

 

Moja odpowiedź, żeby nie było offtop'a:

Topornym rozwiązaniem (jeżeli masz dużo danych w sensie ilości, a nie rozmiaru, to polecam skopiować używane tabele do nowej bazy, tam wykonać zapytanie i przerzucić dane do głównej bazy LUB postawić slave'a i na nim wykonać operację pobierając wynik jakimś językiem i wrzucając od razu do bazy macierzystej. Może też rozważ inny system bazodanowy, który będzie albo szybszy albo będzie miał możliwość wykonywania takich operacji bez blokad. Może map-reduce, czy coś.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Patrzę na Wasze wiadomości i zastanawiam się czemu tutaj poziom tak bardzo leży.

 

Porobiłem sobie testy na koncie hostingowym i zrobiłem bazę, zapytanie optymalne, ale dużo danych. Baza zanim przemieliła z kilku tabel to po prostu chwilę pomyślała. Czy nie możecie zrozumieć, że autor ma:

- dobrą strukturę

- dobre zapytanie

- szybki serwer

?

 

Autor nie pyta o to jak zoptymalizować bazę, tylko o techniczne ograniczenia takiego zapytania.

 

Moja odpowiedź, żeby nie było offtop'a:

Topornym rozwiązaniem (jeżeli masz dużo danych w sensie ilości, a nie rozmiaru, to polecam skopiować używane tabele do nowej bazy, tam wykonać zapytanie i przerzucić dane do głównej bazy LUB postawić slave'a i na nim wykonać operację pobierając wynik jakimś językiem i wrzucając od razu do bazy macierzystej. Może też rozważ inny system bazodanowy, który będzie albo szybszy albo będzie miał możliwość wykonywania takich operacji bez blokad. Może map-reduce, czy coś.

 

O rany, no niby tak, al. My chcemy od MrLei informacji, które pomogą nam dobrać odpowiednie warianty żeby "wyleczyć" jego problem i nie musiał wracać z tym na forum co tydzień.

 

Myślę, że temat powinien iść w tę stronę: MrLei, czy przerzucenie tych tabel jest jednorazowe, czy okresowe?

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dziękuje za pomoc, każda pomoc nawet off topic może okazać się pomocna :-)

 

Tabel którą robię to jest tabela " normalizacyjna" czyli taka która właśnie składam z kliku table do jednej która ma chodzić jako "frontend" do szybkiego działania głównych zapytań oraz do zmniejszenia liczby rekordów i aby pozbyć się joinów.

Tabela tworzona jest cyklicznie co godzinę.

Tabela po tworzeniu ma zakładane indexy tam gdzie są wymagane od zapytań głównych na "frontendzie"

Niestety strukture bazy i logikę nie za bardzo chce zmieniać bo to jest aplikacja klienta robiona przez kogoś innego a przebudowa tak "głeboko" aplikacji jest nie opłacalna.

 

 

 

 

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Dodam jeszcze że przerobiłem sprawę widoku w mysql ale efekt jest gorszy od obecnego rozwiązania z select + create...

 

Co do tabeli, która tworze to blokowanie tej tabeli nie jest problem gdyż do tego mam ustawione działanie tabel na przemiennie czyli jeśli jest tworzona tabela nowa "a" to frontend dział obecnie na tabeli "b" i odwrotnie.

 

Będę testował scenariusz taki że zbuduje slave tylko z tabel potrzebnych do budowy tabli nowej.

Na slave będe robił nowa tabel i potem ją wsadzał do mastera.

 

 

Edytowano przez MrLei (zobacz historię edycji)

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Toporne, ale slave może stać zablokowany, a wrzucasz nową tabelę na master i aplikacja może jej używać.

 

Możesz powiedzieć co to są za dane konkretniej?

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Toporne to fakt... ale slave chcę zrobię tylko do budowania tabeli "normalizacyjne" po to aby to ona była właśnie tylko obciążana.

 

Typ danych tabel, ta największa ma 152 pola różnych typów varchar, int, mediumtext, enum , data, datetime, double, set.

 

 

 

 

 

 

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Sam to zaproponowałem, ale wiem, że można to tak zrobić stąd mój pomysł. Na pewno są jakieś sposoby na wykonanie takiego zapytania bez blokad i robienia slave, ale nikt ich tutaj nie chce przedstawić, a znanym nam sposobem powinno śmigać.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Sam to zaproponowałem, ale wiem, że można to tak zrobić stąd mój pomysł. Na pewno są jakieś sposoby na wykonanie takiego zapytania bez blokad i robienia slave, ale nikt ich tutaj nie chce przedstawić, a znanym nam sposobem powinno śmigać.

 

Tak wiem i dziękuje bardzo :-)

Też właśnie liczyłem że ten problem ma inne rozwiązanie.

Udostępnij ten post


Link to postu
Udostępnij na innych stronach

Bądź aktywny! Zaloguj się lub utwórz konto

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto

Zarejestruj nowe konto, to proste!

Zarejestruj nowe konto

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się

Zaloguj się, aby obserwować  

×