Izolacja kolumny w mysql

Jeżeli w zapytaniu nie zostały wyizolowanie zindeksowane kolumny, wówczas baza danych MySQL w zasadzie nie może używać indeksów na kolumnach, przynajmniej do chwili ich
wyizolowania w zapytaniu. Pojęcie „izolacji” kolumny oznacza, że nie powinna być częścią wyrażenia, ani znajdować się wewnątrz funkcji używanej w zapytaniu. Przykładowo poniższe zapytanie nie będzie używało indeksu na kolumnie actor_id:
mysql> SELECT actor_id FROM sakila.actor WHERE actor_id + 1 = 5;
Człowiek może z łatwością dostrzec, że klauzula WHERE odpowiada wyrażeniu actor_id = 4, ale baza danych MySQL nie będzie mogła rozwiązać równania dla kolumny actor_id. To jest zadanie dla człowieka. Należy nabrać nawyku upraszczania kryteriów klauzuli WHERE, tak aby zindeksowana kolumna była jedyną znajdującą się po jej stronie operatora porównania.Poniżej przedstawiono inny przykład często popełnianego błędu:
mysql> SELECT ... WHERE TO_DAYS(CURRENT_DATE) - TO_DAYS(date_col) <= 10;
Powyższe zapytanie odszuka wszystkie rekordy, dla których wartość date_col będzie mniejsza niż dziesięć dni, ale nie będzie używać indeksów z powodu zastosowania funkcji TO_DAYS().Lepszym sposobem zapisania tego zapytania może być:
mysql> SELECT ... WHERE date_col >= DATE_SUB(CURRENT_DATE, INTERVAL 10 DAY);
Powyższe zapytanie nie będzie miało problemów z wykorzystaniem indeksów, ale wciąż można je usprawnić na pewien sposób. Odwołanie do CURRENT_DATE uniemożliwia buforowi zapytania buforowanie jego wyników. Rozwiązaniem jest zastąpienie odwołania do CURRENT_DATE dosłowną wartością daty:
mysql> SELECT ... WHERE date_col >= DATE_SUB('2008-01-17', INTERVAL 10 DAY);

Komentarze wyłączone