Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja wyniku
daniel1302
post
Post #1





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


Witam, mam zapytanie które oznacza mi co drugi wynik pewną flagą.
Chodzi mi głównie o zapytanie SELECT. Dla 6 000-10 000 rekordów działa spoko. Ale jak spróbuję przeedytować tabelkę 500000 rekordów to juz jest problem
Moja tabelka
  1. id|email|status|flag

I w co drugim rekordzi potrzebuję mieć 1 a w co drugim 0 maksymalnie równo rozłożone rekordy. Sortuję po czasie dodania rekordu (czyli ID), Przykłodowo musze równo podzielić maile np z przed dwóch lat.

Skrypt jest częściej wykorzystywany. Obecnie nie poradziłem sobie z jego uruchomieniem. Robię to tak, że eksportuję w ekselu usuwam odpowiendie wiersze, a te pozostałe oznaczam flagą i importuje do innej tabelki.

  1. SET @rowNumber = 0;
  2.  
  3. UPDATE adresy SET flag=1 WHERE id IN (SELECT t.id
  4. FROM (
  5. SELECT DISTINCT email, `status`, id, @rowNumber := @rowNumber+ 1 AS rn
  6. FROM adresy
  7. WHERE `status` IN (1, 3)
  8. GROUP BY email ORDER BY id
  9. ) t
  10. WHERE t.rn % 2 = 0 ORDER BY t.rn )


Jak to zoptymalizować jak uruchomić na tabeli pół miliona rekordów nawet konsola się wiesza.

Ten post edytował daniel1302 26.01.2015, 18:25:13
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 5)
Pyton_000
post
Post #2





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


Na polu status masz indeks?
Go to the top of the page
+Quote Post
daniel1302
post
Post #3





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


Pola status to poprostu statusy użytkowników. Określają jakie dane chcą otrzymywać. Nie mam indeksów

Ten post edytował daniel1302 27.01.2015, 07:57:29
Go to the top of the page
+Quote Post
mmmmmmm
post
Post #4





Grupa: Zarejestrowani
Postów: 1 421
Pomógł: 310
Dołączył: 18.04.2012

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


Jak chcesz szybko, to taki pomysł:
1. utwórz tabelę: ID AutoIncrement, tabID INT, Flag INT
2. przekopiuj do niej wartosci z twojej tabeli: INSERT INTO tabela (tabID) SELECT id FROM twoja_tabela
3. zupdejtuj tę nową tabelę: UPDATE tabela SET flag=(ID % 2)
4. załóż indeks na tabID
5. zupdejtuj swoją tabelę korzystając z tej
Go to the top of the page
+Quote Post
Pyton_000
post
Post #5





Grupa: Zarejestrowani
Postów: 8 068
Pomógł: 1414
Dołączył: 26.10.2005

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


@daniel1302 po moim poście sądziłem że dodasz ten indeks i przetestujesz... No cóż. Przeliczyłem się.
Załóż tam indeks zwykły i przetestuj.
Go to the top of the page
+Quote Post
daniel1302
post
Post #6





Grupa: Zarejestrowani
Postów: 602
Pomógł: 30
Dołączył: 1.08.2007
Skąd: Nowy Sącz

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


Przetestowałem ale jeszcze nie zdążyłem odpowiedzieć bo jestem w pracy. Dzięki działa 5 min ale jest to już akceptowalny dla mnie wynik. + Dla ciebie oczywiście


Poczytałem o indeksach, jeśli masz jakieś propozycje ciekawych artykułów to proszę o podesłanie nt. MySQL. Podobają mi się bazy danych i planuję nauczyć się ORACLE.


mmmmm myślałem o twoim pomyśle, ale chciałem uniknąć tworzenia nowej tabelki bo przy rozmiarze tabeli 400 mb to troche zajmie. A zależy mi na szybkości.

Nie moge edytować, ale jak komuś to się przyda to dzisiaj wpadłem na optymalniejszy sposób wykonywnaia tego zapytania be widoku częściowego
  1. UPDATE tabela SET STATUS=(((@rowNumber:=@rowNumber+1)%2) +1) WHERE ... ORDER BY id ASC;



Na 500 tyś wykonuje się 2 sec

Ten post edytował daniel1302 27.01.2015, 12:27:55
Go to the top of the page
+Quote Post

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: 23.08.2025 - 08:27