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
abusiek
post
Post #2





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

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


Mozna by bylo to zapytanie zlozyc tak, ale ono wtedy nie zwraca mi wynikow ktore potrzebuje:

  1. SELECT SQL_NO_CACHE max( df.id ) , df.documentId
  2. FROM FIELDS df
  3. JOIN FIELDS df2 ON ( df2.name = 'machine'
  4. [sql]AND df.id = df2.id )
  5. WHERE df2.value LIKE '%424591%'
  6. GROUP BY df.documentId, df.name
  7. LIMIT 0, 30


Mi chodzi o to zeby uwzglednic tylko ostatnia 'wersje' pola dokumentu a zapytanie powyzej zwraca dokument ktory kiedys mial w polu machine wartosc 424591, czyli zupelna pomylka (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)

Z kolei to zapytanie ktore zwraca poprawne wyniki:

  1. SELECT df2.documentId
  2. FROM ( SELECT max( df.id ) AS id
  3. FROM documents df
  4. GROUP BY df.documentId, df.name
  5. ) AS nasza
  6. JOIN documents df2 ON ( df2.name = 'machine' AND df2.value LIKE '%424591%' AND nasza.id = df2.id )


trwa az 18.5s. Tutaj wybieram najpierw ostatnie idiki pola o danej nazwie dla danego dokumentu i dopiero potem lacze je z wynikami przeszukiwania co daje oczekiwany rezultat ale trwa straaaasznie dlugo (IMG:http://forum.php.pl/style_emoticons/default/sad.gif)
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: 26.08.2025 - 12:12