Witam, mam bazę w której jest jedna tabela ze średnio ponad 200 mln rekordów która zawiera przykładowe kolumny:
id_row int(11),
Date date,
NbrA char(24),
NbrB char(24),
System varchar(12);
oraz kluczami:
PRIMARY KEY id_row,
KEY StartDate(StartDate),
KEY NbrA(NbrA),
KEY NbrB(NbrB),
KEY NbrA_2(NbrA,StartDate),
KEY NbrB_2(NbrB,StartDate),
W kolumnie Date jest data wystąpienia pewnego zdarzenia, NbrA zawiera do 24 znaków identyfikatora pewnego nadajnika, NbrB identyfikator odbiornika i System to oczywiście identyfikator systemu zawierającego jego nazwę. Tabela zawiera jeszcze inne dane które nie są jednak ważne.
Mam problem taki że gdy w WHERE podaję do wyszukania parametr z podzapytania to baza nie wykorzystuje kluczy tylko przeszukuje zawsze całą tabelę np:
SELECT StartDate, NbrA, NbrB, System
FROM tbl
WHERE
StartDate>=CONCAT('',(SELECT Date FROM SysIF WHERE id=1),'') AND
(NbrA like CONCAT('',(SELECT NbrA FROM SysIF WHERE id=1),'') OR NbrB like CONCAT('',(SELECT NbrB FROM SysIF WHERE id=1),''))
Zamiast użyć kluczy NbrA_2 i NbrB_2 baza szuka po całej tabeli i trwa to bardzo długo. Gdy podam na sztywno dane do wyszukania bez podzapytań to klucze są używane i trwa to o wiele szybciej np:.
SELECT StartDate, NbrA, NbrB, System
FROM tbl
WHERE StartDate>='2020-01-01' AND (NbrA like '123qaz' OR NbrB like '456wsx' );
Prośba o podpowiedź co robię źle i jak to poprawić :-)