Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> mysql, wolno dzialajace zapytanie
abusiek
post
Post #1





Grupa: Zarejestrowani
Postów: 89
Pomógł: 5
Dołączył: 23.10.2006
Skąd: Gda?sk

Ostrzeżenie: (0%)
-----


Witam!

Mam tabele fields o nastepujacej strukturze i okolo 2mln wierszy:

id(int), document_id(int), name(varchar), value(text)
index(document_id, name, id)

W tabeli trzymane sa nazwy pol i ich wartosci z refem do dokumentu. Dokument ma tak jakby wersje, pole jest edytowane poprzez wstawienie wiersza o refie do tego samego dokumentu z ta sama nazwa. czyli jesli mam wiersz:

1 | 1 | imie | adrian

i wstawiam

2 | 1 | imie | marek

to znaczy ze wyedytowalem dokument '1' i zmienilem wartosc pola imie z adrian na marek.

aktualne wartosci dla poszczegolnych pol jestem w stanie wyciagnac bardzo szybko dzieki indexowi (0.07 s):

  1. SELECT max(d.id), d.document_id, d.name, d2.value FROM documents d, documents d2 WHERE d.id = d2.id GROUP BY d.documentId, d.name


ale kiedy chce przeszukac wyniki po value zapytaniem:

  1. SELECT STRAIGHT_JOIN <span style ='color:blue'>max(d.id), d.documentId, d.name, d2.value FROM documents d, documents d2 WHERE d2.name = 'first_name' AND d2.value = 'Adrian' AND d.id = d2.id GROUP BY documentId, name


to wykonanie trwa juz okolo 15s.

Ma ktos jakis pomysl?? bo mi sie juz wyczerpaly (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

pozdrawiam

adrian

Ten post edytował abusiek 8.12.2008, 23:49:43
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
sowiq
post
Post #2





Grupa: Zarejestrowani
Postów: 1 890
Pomógł: 339
Dołączył: 14.12.2006
Skąd: Warszawa

Ostrzeżenie: (0%)
-----


Sposób:
  1. SELECT * FROM tabela1, tabela2 WHERE tabela1.id = tabela2.id
nie jest najlepszym rozwiązaniem przy takiej ilości danych. A to z prostej przyczyny. Pierwsza część zapytania (FROM tabela1, tabela2) tworzy iloczyn kartezjański dwóch tabel, czyli jak masz po 1 mln rekordów, to na początku robi się 1mln^2 wyników. Dopiero WHERE tabela1.id = tabela2.id wybiera z tego iloczynu interesujące Cię wyniki. GROUP BY dodatkowo obciąża zapytanie.

Zainteresuj się składnią JOIN - miałem bardzo podobny problem i po zamianie iloczynu kartezjańskiego na JOIN'y zszedłem z 8 sek. do 0.02 sek.

[edit]
Kiedyś pisałem o tym na Gronie, może znajdziesz tam kilka wskazówek: http://grono.net/forum/topic/13590469/0/ (jak nie masz konta, to zrobię screen'a)

Ten post edytował sowiq 9.12.2008, 00:07:35
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 25.08.2025 - 16:20