suli
27.02.2012, 10:16:48
mam taka baze danych:
products - pola: id,active(enum),deleted(enum), + kilka innych pol ale akurat tu nie uzywanych
products_contents - pola: pro_id(relacja do products.id),name(varchar(150), + kilka innych pol ale akurat tu nie uzywanych w tym content(text z fullsearch))
produktow jakies 200k i baza ciagle rosnie
robie prostego joina
explain select * from products join products_contents on pro_id = id where active ='1' and deleted = '0' Limit 10
wszystko super smiga az milo, w extra mam tylko: "using where)
problem pojawia sie wylacznie przy sortowaniu czyli:
explain select * from products join products_contents on pro_id = id where active ='1' and deleted = '0' order by name asc Limit 10
smiga troche gorzej no i tworzy mase tymczasowych tabel (probowalem juz zamieniac kolejnosciami products z products_contents i dziala to tylko wtedy gdy nie mam where dla products).. przez co admin mnie sie czepia, dodatkowo w extra mam:
Using where; Using temporary; Using filesort
ktos ma jakis pomysl jak to zoptymalizowac ?
przychodza mi do glowy dwa rozwiazania ale kazde ma jakies tam wady:
1. polaczyc obie tabele w jedna
2. skopiowac kolumny active i deleted do products_contents i w tym jednym przypadku korzystac wylacznie z products_contents
3. przeniesc name do tabeli products - chyba najlepsze rozwiazanie
4. ktos z na jakies inne ?
gothye
27.02.2012, 10:21:48
pokaż może strukturę tabel ,a te tabele 'tymczasowe" to czasem nie widoki ?
suli
27.02.2012, 10:43:03
nie, korzystam ze zwyklych tabel, widoki co prawda sa stworzone dla tych tabel ale sa uzywane zupelnie gdzie indziej
struktury niestety nie bardzo moge pokazac ;/
jeszcze zauwazylem pewna rzecz... jak dam samo where deleted ='0' to korzysta tylko z where (juz bez tymczasowych tabel) a jak dam samp active = '1' to korzysta ze wszystkiego czyli Using where; Using temporary; Using filesort
dziwne, bo obie kolumny maja zalozone oddzielnie kazdy index + jeden index laczacy je dwie
alegorn
27.02.2012, 13:54:07
korzystajac z order by wymuszasz niejako stosowanie tabel tymczasowych.
zastanow sie czy to sortowanie jest ci tutaj koniecznie potrzebne.
byc moze odpowiednie zastosowanie indeksow pozwolilo by ci wyeliminowac potrzebe sortowania - ale tutaj to juz potrzeba by bylo posprawdzac strukture tabeli, sprawdzic baze..
(to tez dotyczy tego pola 'active' masz na ty index?)
jesli nie masz innej mozliwosci, zastanow sie jak czesto to wykorzystujesz w aplikacji (w sensie dane z tego query)
jesli jest to wielokrotne - pomysl czy nie bylo by lepiej przeorganizować strukturę tabel, lub tez, czy lepiej bedzie JAWNIE utworzyc tabele tymczasowa i to z niej korzystac.
jesli nie da sie inaczej - spróbuj ograniczyc liczbe rekordow, tabele tymczasowe, poki nie musza byc zapisywane na dysk - nie sa czasochlonne (co nie oznacza ze nie pozera zasobow)
suli
27.02.2012, 14:38:45
posprawdzalem indexy wszedzie jest ok..
co do tabel tymczasowych stworzonych przezemnie poprobuje
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę
kliknij tutaj.