Przykładowy schemat prostej bazy danych (w dużym uproszczeniu nawiązuje do części bazy jaką mam faktycznie wykonaną):
tabela "uzytkownicy":
- id (klucz podstawowy)
- login
- pass
- ranga_id (klucz obcy)
tabela "rangi":
- id (klucz podstawowy)
- nazwa
tabela "tematy":
- id (klucz podstawowy)
- autor_id (klucz obcy)
- tytul
- wizyty
- dzial (skrót nazwy działu do którego zalicza się artykuł, np: css, php, mysql)
- gotowy (wartości: 0 lub 1; 0 -> artykuł w trakcie tworzenia, 1 -> artykuł gotowy do wyświetlenia)
tabela "tematy_tekst":
- artykul_id (klucz obcy)
- tresc (w osobnej tabeli, ponieważ po pierwsze nie zawsze używana w połączeniu z resztą danych dotyczących tematów, np: podczas wyświetlania spisu tematów nie wykorzystywana, dane z tej tabeli są pobierane jedynie po wejściu w dany artykuł; po drugie pole treść posiada duży rozmiar, dane przechowywane w formacie utworzonym poprzez edytor WYSIWYG)
1. Różnica między złączeniami typu HASH a NESTED LOOPS (wątpliwość ta pojawiła się po przeczytaniu: http://forum.php.pl/index.php?showtopic=64632)
Jak jest z tym w rzeczywistości?? Czytając inny artykuł na forum jeden z użytkowników napisał także, że przy pobieraniu danych z tabel z więcej niż 100 rekordów różnica między tymi złączeniami jest widoczna. Tyle, że serwis umieszczony będzie na home.pl (hosting), tam nie mam możliwości zmiany "SET enable_nestloop = off;" o czym pisze "prond" w swoim poście. Czyli jak dobrze rozumiem chcąc pobrać dane dotyczące temtów z danej sekcji lepszym rozwiązaniem jest:
SELECT rangi . * , tematy . * , tematy_tekst . * , uzytkownicy . * FROM rangi INNER JOIN uzytkownicy ON rangi.id = uzytkownicy.ranga_id INNER JOIN tematy ON uzytkownicy.id = tematy.autor_id INNER JOIN tematy_tekst ON tematy.id = tematy_tekst.artykul_id AND tematy.dzial = 'css' AND tematy.gotowy = '1' ORDER BY tematy.id LIMIT 0, 30
niż:
SELECT rangi . * , tematy . * , tematy_tekst . * , uzytkownicy . * FROM rangi, tematy, uzytkownicy, tematy_tekst WHERE rangi.id = uzytkownicy.ranga_id AND tematy.id = tematy_tekst.artykul_id AND uzytkownicy.id = tematy.autor_id AND tematy.dzial = 'css' AND tematy.gotowy = '1' ORDER BY tematy.id LIMIT 0, 30
Z drugiej strony nie wiem jak sprawdzić ustawienie opcji "enable_nestloop", czy wartość "on" jest wartością domyślną

2. Czy stosowanie widoków ma sens??
Miałem zamiar korzystać z nich, np:
- widok(i) zawierający dane artykułów (tematów) z danego działu (np: css) gotowych do publikacji (1)
- widok zawierające dane nieukończonych artykułów(0)
Sądziłem, że to usprawni, przyśpieszy pobieranie danych z bazy. Lecz czy to prawda?? (tu znowu nawiązanie do przytoczonego wyżej postu). Czy może takie wykorzystanie widoków jest marnowaniem ich możliwości?? Jeśli tak to proszę o podpowiedzi apropo sytuacji w odniesieniu do tego przykładu bazy, w których wykorzystanie widoków byłoby uzasadnione i wskazane??
3. Czy typ złączenia wykorzystanego przy tworzeniu widoku ma wpływ na wydajność podczas korzystania z niego?? (kolejne pytanie nawiązujące do przytoczonego postu);
czyli, czy np:
CREATE VIEW v1_css AS SELECT rangi.nazwa, tematy. * , tematy_tekst.tresc, uzytkownicy.login FROM rangi INNER JOIN uzytkownicy ON rangi.id = uzytkownicy.ranga_id INNER JOIN tematy ON uzytkownicy.id = tematy.autor_id INNER JOIN tematy_tekst ON tematy.id = tematy_tekst.artykul_id AND tematy.dzial = 'css' AND tematy.gotowy = '1' ORDER BY tematy.id LIMIT 0, 30
różni się od:
CREATE VIEW v2_css AS SELECT rangi.nazwa, tematy. * , tematy_tekst.tresc, uzytkownicy.login FROM rangi, tematy, uzytkownicy, tematy_tekst WHERE rangi.id = uzytkownicy.ranga_id AND tematy.id = tematy_tekst.artykul_id AND uzytkownicy.id = tematy.autor_id AND tematy.dzial = 'css' AND tematy.gotowy = '1' ORDER BY tematy.id
Czy metoda tworzenia widoku wpływa na wydajność korzystania z niego?? Jeśli tak to czy ma to związek z wspomnianą wcześniej zmienną "enable_nestloop"??
Wiem że trochu to przydługawe, ale chciałem jak najdokładniej wyjaśnić moje wątpliwości. Proszę o Wasze rady i pomoc w wybraniu najlepszych metod.