Przyspieszanie wyszukiwania

0

Witam!

Mam pytanie dot. przyspieszenia wyszukiwania danych z bazy. Mam taką sytuację.
Mam dwie tabele: tabela1 i tabela2 w obu mam pole np: tytul
w Tabeli1 mam ok. 16tys rekordów a w tabeli2 ok 6 tys rekordów.
chcę znaleźć jakich elementów "tytul" z tabeli1 nie ma w tabeli2
wykorzystuję do tego zapytanie:

 
SELECT tabela1.tytul
			FROM tabela1
			LEFT JOIN tabela2 ON tabela1.tytul = tabela2.tytul
			WHERE ((tabela2.tytul) IS NULL )
			GROUP BY tabela1.tytul

jako serwer wykorzystuję XAMPPa i to zapytanie wykonuje mi się w około 100 s (musiałem nawet wydłużyć czas w max_execution_time)
później chciałem jeszcze zmodyfikować to zapytanie żeby liczył i sortował wg. wystąpienia tytulu w tabela1. ale zapytanie wykonuje się w nieskończoność.
I tutaj moje pytanie. Nawet pierwsze zapytanie wykonuje się bardzo długo ? Czyżbym miał za dużo danych w tabelach ? Ale to przecież żadna baza 16tyś rekordów :) nawet excel ma więcej rekordów w arkuszu?

Pytanie: Czy i jak można przyspieszyć działanie "bazy" tzn żeby zapytania się szybciej wykonywały?

jeśli znacie temat pomóżcie :)

pozdrawiam
Klimba

0

Załóż indeks na polu tytuł w obu tabelach.

0

przy zakładaniu indeksu na polu tytul cały czas wyskakiwał mi jakiś błąd bo to pole miałem o typie "text" pisało coś że nie może założyć indeksu itp
po zmianie typu kolumny z text na varchar (bo doczytałem się na necie że to też przyspiesza wyszukiwanie) i nadaniu indeksów zwykłych na kolumny tytul byłem w szoku :)

oto wyniki testów
testowałem na zapytaniu które jest na górze postu

 bez indeksów z polem tytul jako text 
Pokaż rekordy 0 - 29 ( 1 646 wszystkich, Wykonanie zapytania trwało 74.5647 sekund(y))


z indeksami z polem tytul jako varchar
Pokaż rekordy 0 - 29 ( 1 646 wszystkich, Wykonanie zapytania trwało 0.0035 sekund(y))

coś pięknego :)

0

A po co ci GROUP BY w tym zapytaniu? Aby pozbyć się duplikatów? Jeśli masz duplikaty, to masz je w tabeli1, bo zapytanie jest tak skonstruowane, że wyświetla ci co najwyżej po jednym rekordzie z tabela1 (nie jest brany iloczyn kartezjański)...

0

To jeszcze zapytam tak bo nie mogę sobie poradzić

jak przerobić zapytanie poniżej

SELECT tabela1.tytul
                        FROM tabela1
                        LEFT JOIN tabela2 ON tabela1.tytul = tabela2.tytul
                        WHERE ((tabela2.tytul) IS NULL )
                        GROUP BY tabela1.tytul

 

tak żeby pokazywało tytuły z tabeli1 które nie znajdują się w tabeli2 i żeby wyniki wyświetliły się posortowane malejąco wg ilości wystąpienia tytułu w tabeli1 czyli powiedzmy że są dwa tytuły w tabeli1 które nie występują w tabeli2 np: tytuł1: dziady i tytuł2: lalka i np dziady w tabeli1 występuje 2 razy to żeby w wynikach dziady pojawiły się wyżej niż lalka i żeby obok dziadów pojawiła się informacja że one wystąpiły 2 razy

0
SELECT tabela1.tytul, count(*) as ilosc
FROM tabela1
LEFT JOIN tabela2 ON tabela1.tytul = tabela2.tytul
WHERE ((tabela2.tytul) IS NULL )
GROUP BY tabela1.tytul
ORDER BY ilosc desc

?

0

Wielkie dzięki po kilku próbach też dałęm radę właśnie w ten sposób :)

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