[mysql] czy IN wylacza LIMIT

0

Witam,
Mam problem. Jesli mam zapytanie jak ponizsze, to czy post_id IN ( 3000 roznych post id oddzielonych przecinkiem np. 3000,4232,46346,2534634,64373523,62436236,32263,6236,34,457 etc.) to LIMIT jest pomijany?

SELECT pt.post_text
FROM " . POSTS_TABLE . " p, " . POSTS_TEXT_TABLE . " pt
WHERE p.post_id IN ( 3000 post_id's )
LIMIT 0,16

Trwa bardzo dlugo, wyglada na to ze LIMIT coprawda dzialo jako tako bo wyswietla tylko 16 rekordow ale dlugosc jego wykonania ~13 sekund wskazuje na to ze wykonal je dla 3000 post_id a nie dla 16.

Ktos mnie upewni w tym?

Pozdrowionka

0

Laczysz 2 tabele bezwarunkowo i do tego dolaczasz laczenie 3 tabeli z 3000 tys. wierszy. Co ma do tego limit, skoro najpierw trzeba wykonac laczenie, zeby mozna bylo obciac wynik?

0

jak bezwarunkowo masz: post_id IN ( lista id )

A te 3000 id'kow chcesz miec tylko 16 i koniec wiec dajesz limit 16 ale on jedzie dla wszystkich 3000

0

Bezwarunkowo laczone sa tabele (domyslny join), a nie ze cale zapytanie jest bezwarunkowe. W zwiazku z czym masz takie etapy:

  1. join bez pola laczacego 2 tabel (p i pt)
  2. join z (domyslnie) tabela skladajaca sie z 3000 wierszy z polem laczacym p.post_id
  3. Wybor wierszy po p.post_id
  4. Wybor 16 pierwszych wierszy.

Ja bym sie przyczepil tylko do tego pierwszego - znaczy czemu nie polaczysz tabel normalnie (joinem z polem laczacym) a zostawiasz to w gestii optymalizatora zapytan mysql'a? Jesli taki tam jest ;)

PS. Uzyj EXPLAIN, zeby zobaczyc jak wykonywane jest zapytanie.

0

MySQL ma słaby optymalizator zapytań (o ile ma ;) ), a podzapytania są jego piętą achillesową - być może nie umie wykonać takiego zapytania potokowo. Teoretycznie takie zapytanie powinno się wykonywać tak, że złączenie wykonuje się potokowo (np. pętlami zagnieżdżonymi z indeksem) i czyta się z potoku tak długo, dopóki nie zgromadzi się liczby rekordów podanej w LIMIT. Niestety takie zapytania są problematyczne nie tylko dla MySQLa, Postgres też nie potrafi oszacować prawidłowo liczby rekordów czytanych z tabeli jak ma klauzulę LIMIT, przez co zwykle wybiera w tej sytuacji niepotokowy, beznadziejny plan wykonania.

Pewien też jesteś, że podzapytanie nie liczy się zbyt długo?
Zrób EXPLAIN.

1 użytkowników online, w tym zalogowanych: 0, gości: 1