Mam tabelę MySQL DB z wieloma polami typu daty. Muszę wykonać różne zapytania SELECT na tej tabeli, ale nie jestem pewien, w jaki sposób najlepiej znaleźć rekordy z tego samego miesiąca.Efektywne zapytanie SELECT w celu znalezienia rekordów w ciągu miesiąca
wiem, że mogę wykonać następujące czynności:
SELECT *
FROM table
WHERE MONTH(somedate) = 5
AND YEAR(somedate) = 2015
Ale czytaj dalej, że nie jest skuteczny i że powinienem iść z wykorzystaniem rzeczywistych terminach, tj
SELECT *
FROM table
WHERE somedate BETWEEN '2015-05-01' AND '2015-05-31'
Jednak wszystkie I byłby miesiąc i rok jako zmienne przychodzące z PHP. Jak łatwo i szybko obliczyć ostatni dzień miesiąca, jeśli wybieram drugą opcję?
Znajduję "między", aby być wolniejszym niż "miesiąc/rok" i "jak", na moim db. Miesiąc/rok = 'Pokazuje wiersze od 0 do 29 (łącznie 77, zapytanie trwało 0,0825 s)'. Between = 'Pokazuje wiersze 0-29 (łącznie 77, Query zajęło 0.1059 sec)'. Like = 'Pokazuje wiersze od 0 do 29 (łącznie 77, Query trwało 0,0815 s)'. To jest na tabeli z wierszem 7k. Ta nić wskazuje jednak w innym kierunku. http://dba.stackexchange.com/questions/96245/mysql-date-field-filter-by-like-vs-month – chris85
MySQL może efektywnie korzystać z indeksu z wiodącą kolumną 'somedate'. Jeśli nie masz takiego indeksu, możesz go utworzyć np. 'CREATE INDEX ON table (somedate)'. Tak długo, jak zapytanie zwróci mniej niż 10% wierszy w tabeli, indeks sprawi, że zapytanie będzie znacznie szybsze. Dzięki funkcjom owiniętym wokół kolumny somedate, MySQL musi ocenić te funkcje w każdym wierszu w tabeli. – spencer7593
Użyj 'EXPLAIN', aby zobaczyć plan wykonania. W celu porównania wydajności upewnij się, że wyniki zapytania nie są zwracane z pamięci podręcznej zapytań. Można to zrobić na kilka sposobów, np. Trafienie 'SQL_NO_CACHE', uwzględnienie zmiennej zdefiniowanej przez użytkownika w zapytaniu, wyłączenie pamięci podręcznej zapytań itp. (W rzeczywistości mamy serwery MySQL skonfigurowane tak, aby buforowały * tylko * zapytania zawierające wskazówkę" SQL_CACHE " , więc kontrolujemy, jakie zapytania mogą być buforowane, i zapobiegamy wyprowadzaniu wyników przez zapytania, których nie potrzebujemy w pamięci podręcznej.) – spencer7593