Kā optimizēt MySQL kverijus ar datuma intervālu

Gadās, ka no datubāzes ir jādabū ārā kaut kāda informācija, kas saistās ar laika intervālu. Piemēram iepriekšējā mēneša raksti. Viens veids kā to izdarīt būtu ar šādu kveriju:
SELECT * FROM posts WHERE date > DATE_SUB(NOW(), INTERVAL 1 MONTH)
Lai vaicājums notiktu ātrāk, vajadzētu posts tabulai vajadzētu uzlikt indeksu laukam date, bet iepriekšējā kverija gadījumā no tā nebūs lielas jēgas, jo "date >" konstrukcija neizmanto indeksu priekšrocības. Lai viss būtu labi un tiktu izmantotas indeksu sniegtās priekšrocības iekpriekšējo kverriju vajadzētu pārveidot sekojošā formā:
SELECT * FROM posts WHERE date BETWEEN DATE_SUB(NOW(), INTERVAL 1 MONTH) AND NOW()
Papildus info par indeksiem MySQL dokumentācijā

Komentāri

Kaspars Foigts teica…
Pāris lietas.

a) Daudz ērtāk (lasāmāk) ir izmantot konstrukciju "date - interval 1 month", nevis funkciju date_sub().

b) Vēlams izmantot arīdzan Query Cache. Tad būtu nepieciešams aizvietot NOW() ar PHP (vai kā cita) ģenerētu datumu, kurš noapaļots līdz, teiksim, dienām.
Vērtīgi papildinājumi.. :)

No savas puses varu pievienot vēl vienu atklājumu. Jaunajā Debian Lenny esošais MySQL 5.0.51a-24 ir kļūdains un viņā šī lieta nestrādā (vienkārši netiek izmantoti indeksi). Risinājums ir apgreidoties uz nestabilo sid mysql versiju, kur šī lieta strādā, bet tā ir "nestabilā" versija.. Tā kā jālemj katram pašam..

Ja vēl varat, var nogaidīt ar Etch upgreidu uz Lenny.

Populāras ziņas