SQL - optymalne zapytanie

Mam bazę danych o takim schemacie:

alt text

Dostępną dla testów pod adresem:
http://blueman.vipower.pl/phpmyadmin/
login: blueman_tagdb
hasło: yytcjo.0

Do wybierania plików z jednym tagiem można skorzystać z tego zapytania:

SELECT f.* FROM tags t LEFT JOIN f_has_t ft ON t.id=ft.tag_id LEFT JOIN files f ON ft.file_id=f.id WHERE t.word LIKE '%testari%'

Dla ww. plików można pobrać tagi jakie są używane w tej grupie plików:

SELECT t.word,count(t.word) co FROM tags t, f_has_t ft WHERE ft.tag_id=t.id AND ft.file_id IN (31901,31902,31903,31904,31905,31906,31907,31908,31909,31910,48996,49688,49689,49690,49691, 49692,49693,49694,49695,49696,49697,87132) GROUP BY t.word ORDER BY co DESC

W jaki sposób teraz z bazy danych jak najmniejszą ilością zapytań (i jak najoptymalniejszych) "wyłowić" wszystkie pliki, które mają tagi X, Y i Z (czyli każdy z plików ma mieć te 3 tagi)

2 lata temu | edytowane przez: BlueMan 1094739

  • Zacznij od:

     SELECT f.id, f.path, f.name, count( * )
     FROM tags t
     LEFT JOIN f_has_t ft ON t.id = ft.tag_id
     LEFT JOIN files f ON ft.file_id = f.id
     WHERE t.word
     IN ('ripener', 'testari', 'sparver')
     GROUP BY f.id, f.path, f.name
     HAVING COUNT( * ) = 3
    

  • Zapytanie podesłane przez underley wygląda bardzo ładnie, zerknij sobie jednak do wyniku EXPLAIN na tym zapytaniu. Aż prosi się, aby dodać indeks na kolumnę tag_id w tabeli f_has_t. Zmniejszysz ilość sprawdzanych tam rekordów z 900 tysięcy do 9. To może zrobić Ci sporą różnicę w wydajności, szczególnie jeśli ilość danych będzie przyrastać.

Zaloguj się, aby dodać swoją odpowiedź