Kod
CREATE TABLE tabA (
id int(10) unsigned NOT NULL auto_increment,
txt text NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE tabB (
id int(10) unsigned NOT NULL auto_increment,
blobek mediumblob,
PRIMARY KEY (id)
) TYPE=MyISAM;
id int(10) unsigned NOT NULL auto_increment,
txt text NOT NULL,
PRIMARY KEY (id)
) TYPE=MyISAM;
CREATE TABLE tabB (
id int(10) unsigned NOT NULL auto_increment,
blobek mediumblob,
PRIMARY KEY (id)
) TYPE=MyISAM;
Wstawiłem tam takie dane, że w każdym wierszu w polu blobek jest ten sam tekst rozmiaru 51208 bajtów, czyli nie mało

Fajnie.
Wywołuję dwa złośliwe zapytania:
nr 1:
Kod
SELECT
COUNT(tabA.txt)
FROM
tabA,
tabB
WHERE
(
tabA.id = tabB.id
AND
tabA.txt LIKE '%a b c'
AND
tabA.txt LIKE '%xyz%'
AND
tabB.blobek LIKE '%ala ma kota i psa%'
);
COUNT(tabA.txt)
FROM
tabA,
tabB
WHERE
(
tabA.id = tabB.id
AND
tabA.txt LIKE '%a b c'
AND
tabA.txt LIKE '%xyz%'
AND
tabB.blobek LIKE '%ala ma kota i psa%'
);
oraz nr 2 (usunięte zostały tylko warunki na pole txt):
Kod
SELECT
COUNT(tabA.txt)
FROM
tabA,
tabB
WHERE
(
tabA.id = tabB.id
AND
tabB.blobek LIKE '%ala ma kota i psa%'
);
COUNT(tabA.txt)
FROM
tabA,
tabB
WHERE
(
tabA.id = tabB.id
AND
tabB.blobek LIKE '%ala ma kota i psa%'
);
Niby fajnie. Dane są ustawione tak, że tekst "ala ma kota i psa" znajduje się w każdym rekordzie TYLKO na samym końcu pola blobek, również warunki na pole txt ZAWSZE są spełnione. Oba zapytania zwracają to co trzeba, tzn oczekiwany przeze mnie wynik.
Problem.
Zapytane numer 2 jest mniej restrykcyjne, tzn. warunki są słabsze, a więc teoretycznie powinno się wykonać szybciej.
Zapytanie numer 1 (to bardziej złożone) wykonuje się około 0.05 sekundy (pięć setnych), a zapytanie numer 2 (to mniej złożone) wykonuje się w około 10.7 (dziesięć i siedem setnych) sekundy (czyli około 200 razy wolniej niż zapytanie numer 1).
Rozumiem, że statystyka statystyką i błąd jakiś jest dopuszczalny. Rozumiem też, że w zasadzie (w granicach jakiegoś rozsądnego błędu) nie powinna wystąpić zmiana czasu wykonania zapytania po usunięciu warunków na pole txt. Rozumiem też, że w MySQL jest optymalizator, chociaż imho w tym przypadku niewiele może zdziałać, bo warunki na pole txt zawsze są spełnione, więc warunek na blobek i tak musi zostać sprawdzony.
Nie rozumiem jednak, dlaczego czas wykonania zapytania w ogóle wzrósł i dlaczego aż tak drastycznie. Czy ktoś może mi to wyjaśnić?

P.S. Nie, nie zwariowałem, sprawdzałem to kilka razy :mrgreen: