![]() |
![]() |
![]()
Post
#1
|
|
Grupa: Zarejestrowani Postów: 96 Pomógł: 6 Dołączył: 22.08.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Chcę wyciągnąć ilość unikalnych osób, które głosowały. Zakładamy, że użytkownik może głosować kilka razy.
Powyższe zapytanie działa tak jak chcę, jednak czas wykonywania jest nie do zaakceptowania i wynosi 0.8-1.0 sekundy. Dodam, że tabela posiada aktualnie około 600 000 rekordów. Da się szybciej? ![]() -------------------- ZF developer
|
|
|
![]() |
![]()
Post
#2
|
|
![]() Grupa: Moderatorzy Postów: 36 557 Pomógł: 6315 Dołączył: 27.12.2004 ![]() |
a masz założony index na type?
-------------------- "Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista "Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer |
|
|
![]()
Post
#3
|
|
![]() Grupa: Zarejestrowani Postów: 6 476 Pomógł: 1306 Dołączył: 6.08.2006 Skąd: Kraków Ostrzeżenie: (0%) ![]() ![]() |
Zapewne masz jakąś tabelę która reprezentuje sondę na którą mogą głosować użytkownicy, tak? Dodaj do niej dwie kolumny total_votes oraz total_unique_votes. Następnie dodaj sobie wyzwalacz, który po dodaniu rekordu do tabeli vote zwiększy wartości obu kolumn i analogicznie przy usunięciu zmniejszy je. Dzięki temu w ogóle nie będziesz musiał dynamicznie zliczać tych głosów.
EDIT: Dopiero teraz zauważyłem "type = 5" - w takim razie raczej powyższe będzie bezużyteczne. Ten post edytował Crozin 24.05.2011, 10:52:14 |
|
|
![]()
Post
#4
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Jak już to na type, user (2 kolumny w jednym indeksie)
-------------------- |
|
|
![]()
Post
#5
|
|
Grupa: Zarejestrowani Postów: 96 Pomógł: 6 Dołączył: 22.08.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Wpadłem na to sam @wookieb i faktycznie działa. Mam teraz 0.02. Dzięki. Jednak mam kolejny problem. Muszę podczas realizacji innego scenariusza (unikalne grupy) podłączyć inną tabelę:
Czas wykonywania to znowu ~1 sekundy. Analogicznie dodałbym index na dwóch kolumnach w dwóch różnych tabelach, ale chyba się nie da... Ten post edytował snapshot 24.05.2011, 11:36:50 -------------------- ZF developer
|
|
|
![]()
Post
#6
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Tabela user ma index na "user"?
user to login czy id usera? Jezeli login to zacznij używać id. Silnik tabel polecam ustawić na INNODB. -------------------- |
|
|
![]()
Post
#7
|
|
Grupa: Zarejestrowani Postów: 96 Pomógł: 6 Dołączył: 22.08.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Kolumna user w tabli user to int Primary key. Silnik InnoDB
-------------------- ZF developer
|
|
|
![]()
Post
#8
|
|
![]() Grupa: Moderatorzy Postów: 8 989 Pomógł: 1550 Dołączył: 8.08.2008 Skąd: Słupsk/Gdańsk ![]() |
Wrzuć prosze explain z zapytania
oraz schematy tabel user,vote
-------------------- |
|
|
![]()
Post
#9
|
|
Grupa: Zarejestrowani Postów: 96 Pomógł: 6 Dołączył: 22.08.2007 Skąd: Wrocław Ostrzeżenie: (0%) ![]() ![]() |
Dla poprzenich przykładów zmieniałem nazwy tabeli, żeby można było się połapać. Teraz pozwolę sobie zostawić oryginały.
Kod +----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------+-------+-------+ | id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra | +----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------+-------+------- | 1 | SIMPLE | o | ref | fk_Onair_Radio1_idx,fk_Onair_Song1_idx,idradio | fk_Onair_Radio1_idx | 1 | const | 49470 | | | 1 | SIMPLE | s | eq_ref | PRIMARY | PRIMARY | 3 | radio.o.idsong | 1 | | +----+-------------+-------+--------+------------------------------------------------+---------------------+---------+----------------+-------+-------+ 2 rows in set (0.14 sec)
-------------------- ZF developer
|
|
|
![]() ![]() |
![]() |
Wersja Lo-Fi | Aktualny czas: 19.07.2025 - 05:44 |