mam tabelę z użytkownikami, oprócz tego jest kilka tabel, do których użytkownicy wprowadzają dane. Te dane są oznaczone jako wpisane przez nich. Chcę zliczyć, ile dodali tych danych.
SELECT user_id, name, COUNT(DISTINCT objects.object_id) AS count_objects, COUNT(DISTINCT auctions.auction_id) AS count_auctions, COUNT(DISTINCT turnover_id) AS count_turnover, COUNT(DISTINCT artists .artist_id) AS artist_turnover FROM users LEFT JOIN objects USING (user_id) # 8000 rekordów LEFT JOIN auctions USING (user_id) #100 rekordów LEFT JOIN turnover_history USING (user_id) #8000 rekordów LEFT JOIN artists USING (user_id) #2000 rekordów GROUP BY user_id ORDER BY name ASC
To zapytanie działa, ale bardzo długo się wykonuje. Jak powinienem je zoptymalizować? W każdej tabeli na kolumnie 'user_id' mam założony indeks. Oczywiście mogę zrobić osobne zapytanie dla każdej tabeli, ale może jest jakiś sposób optymalizacji tego.
Dodam, że czasami potrzebuję danych z konkretnego miesiąca:
SELECT user_id, name, COUNT(DISTINCT objects.object_id) AS count_objects, COUNT(DISTINCT auctions.auction_id) AS count_auctions, COUNT(DISTINCT turnover_id) AS count_turnover, COUNT(DISTINCT artists .artist_id) AS artist_turnover FROM users LEFT JOIN objects USING (user_id) LEFT JOIN auctions USING (user_id) LEFT JOIN turnover_history USING (user_id) LEFT JOIN artists USING (user_id) WHERE objects.added BETWEEN '2010-03-01' AND DATE_ADD('2010-03-01', INTERVAL 1 MONTH) OR auctions.added BETWEEN '2010-03-01' AND DATE_ADD('2010-03-01', INTERVAL 1 MONTH) OR turnover_history.added BETWEEN '2010-0-013' AND DATE_ADD('2010-03-01', INTERVAL 1 MONTH) OR artists.added BETWEEN '2010-03-01' AND DATE_ADD('2010-03-01', INTERVAL 1 MONTH) GROUP BY user_id ORDER BY name ASC
...to trwa jeszcze dłużej.