Proste zapytanie a optamilizacja

0

Hej, wydaje mi się, że jest dobrze napisane ale chciałbym się upewnić u bardziej doświadczonych bazodanowców ;)
Baza: MySql
Cel: Zapytanie które wyciągnie ilość dodanych newsów dla danego użytkownika i wzięcie pierwszej piątki osób która dodała ich najwięcej.

Zapytanie:

SELECT u.name, count(a.Id) as newsCount, u.userGroup 
FROM users u
INNER JOIN articles a on a.userId = u.Id
WHERE u.userGroup IN ('1', '2', '3', '4', '6', '7')
GROUP by u.Id
ORDER BY count(a.Id) 
DESC LIMIT 0,5

Czy da się to jeszcze zoptymalizować?

0

Tutaj nie ma co optymalizować ;-)
Najwyżej utworzyć odpowiednie indeksy, jeśli brakuje.

0

Ogólnie zauważyłem, że strasznie spowalnia bo praktycznie o 50% czasu wykonywania zapytania sprawdzenie grupy użytkownika u.userGroup IN ('1', '2', '3', '4', '6', '7') .. Ale inaczej da się to zapisać?

0

Akurat w tym konkretnym przypadku mógłbyś napisać po prostu u.userGroup >= 1 AND u.userGroup <= 7 AND u.userGroup <> 5 i to możliwe, że będzie wydajniejsze - jeśli jednak pytasz o jakieś rozwiązanie generyczne, odpowiedź brzmi: utwórz indeks i pozostań przy in.

3

To co napisał @Patryk27 może być wydajniejsze, ponieważ:

SELECT ...
FROM ...
WHERE u.userGroup IN ('1', '2', '3', '4', '6', '7')

-- to tak naprawdę:
SELECT ...
FROM ...
WHERE (
  u.userGroup = '1' OR
  u.userGroup = '2' OR
  u.userGroup = '3' OR
  u.userGroup = '4' OR
  u.userGroup = '6' OR
  u.userGroup = '7'
)

-- czyli w najgorszym wypadku masz 6 testów
-- użycie >= <= to tylko dwa testy (w naszym przypadku 3, bo 5 wykluczamy)
SELECT ...
FROM ...
WHERE u.userGroup >= 1 AND u.userGroup <= 7 AND u.userGroup <> 5

Użycie indeksu zależy też od wielu czynników. Np. indeks może nie być użyty, jeżeli baza danych na podstawie statystyk szacuje, że zostanie wyciągnięte więcej niz 15% całej tabeli (wtedy jej się to nie opłaca, bo użycie indeksu będzie bardziej kosztowne niż skanowanie całej tabeli).

Najlepiej jeżeli zapoznasz się z czymś co się nazywa explain plan. Wtedy będziesz wiedział jakie baza danych podjęła decyzję podczas wykonywania zapytania i będziesz mógł optymalizować.

Polecam książkę http://sql-performance-explained.com/ (tylko 10$ i 200 stron) i bloga autora http://use-the-index-luke.com/. Po przeczytaniu będziesz ekspertem do spraw optymalizacji zapytań ;)

0

OK, wszystko jasne już chłopaki, dzięki ;)

0

@Desu: Na moje te trzy zapytania wykonają się dokładnie tak samo. I na pewno nie będą korzystały z OR, a raczej z algebry zbiorów.
http://sqlfiddle.com/#!9/c197b/2

1 użytkowników online, w tym zalogowanych: 0, gości: 1