konto usunięte

Temat: [InnoDB] Join'y a użycie filesort'a

Witam!
Mam problem z bazami danych mysql (engine InnoDB). Proste zapytanie wykonuje się bardzo długo około 3s, oczywiście indeksy dobrze są ustawione. Bez INNER JOIN'ów wykonuje się ono 0,00009s, a z Join'ami ponad 3s. Co może być problemem? Konfiguracja mysql pozwala na użycie 1024 MB ram, a dane zajmują tylko 40MB. Oto zapytanie:

SELECT entries.id, entries.alias, entries.name, entries.plain, entries.permalink, entries.site, categories.id AS cat_id, categories.name AS cat_name, crawlers.id AS crawl_id, crawlers.name AS crawl_name
FROM entries
FORCE INDEX (
visible_added
)
INNER JOIN categories ON categories.id = entries.catid
INNER JOIN crawlers ON crawlers.id = entries.crawler
WHERE entries.visible = 'n'
ORDER BY entries.added DESC
LIMIT 10

Wynik EXPLAIN:
1 SIMPLE entries ALL NULL NULL NULL NULL 19759 Using where; Using temporary; Using filesort
--------------------------------------------------------------
1 SIMPLE crawlers ALL PRIMARY NULL NULL NULL 2 Using where
--------------------------------------------------------------
1 SIMPLE categories eq_ref PRIMARY PRIMARY 1 warez.entries.catid 1
--------------------------------------------------------------

Czy potrafi ktoś pomóc?

Pozdrawiam, Mateusz

konto usunięte

Temat: [InnoDB] Join'y a użycie filesort'a

Mateusz Sokoła:
Witam!
Mam problem z bazami danych mysql (engine InnoDB). Proste zapytanie wykonuje się bardzo długo około 3s, oczywiście indeksy dobrze są ustawione. Bez INNER JOIN'ów wykonuje się ono 0,00009s, a z Join'ami ponad 3s. Co może być problemem? Konfiguracja mysql pozwala na użycie 1024 MB ram, a dane zajmują tylko 40MB. Oto zapytanie:

SELECT entries.id, entries.alias, entries.name, entries.plain, entries.permalink, entries.site, categories.id AS cat_id, categories.name AS cat_name, crawlers.id AS crawl_id, crawlers.name AS crawl_name
FROM entries
FORCE INDEX (
visible_added
)
INNER JOIN categories ON categories.id = entries.catid
INNER JOIN crawlers ON crawlers.id = entries.crawler
WHERE entries.visible = 'n'
ORDER BY entries.added DESC
LIMIT 10

Wynik EXPLAIN:
1 SIMPLE entries ALL NULL NULL NULL NULL 19759 Using where; Using temporary; Using filesort
--------------------------------------------------------------
1 SIMPLE crawlers ALL PRIMARY NULL NULL NULL 2 Using where
--------------------------------------------------------------
1 SIMPLE categories eq_ref PRIMARY PRIMARY 1 warez.entries.catid 1 --------------------------------------------------------------

Czy potrafi ktoś pomóc?

Pozdrawiam, Mateusz

Witaj.

Mam takie drobne pytanie.. zakładając, że indeks na entries.visible jest bez sensu to chyba niepotrzebnie łaczysz coś joinem, co i tak odflitrujesz w WHERE.

Może to ci coś wyjaśni :

SELECT * FROM foo INNER JOIN (bxx, moo) ON ( foo.male=1 AND foo.fk_bxx_id = bxx.bxx_id AND bxx.fk_moo_id = moo.moo_id);

Osobiście zastanowiłbym się na tym "wymuszonym indeksem", jeżeli masz tam true/false z w miarę równomiernym rozłożeniem, to szkoda twojego zachodu.

btw. te 0,00009s to chyba prosto z cache ;)
--
Pozdrawiam
Rafał.Rafał Wardas edytował(a) ten post dnia 18.06.08 o godzinie 22:44

konto usunięte

Temat: [InnoDB] Join'y a użycie filesort'a

w sumie to problem trochę jest nieaktualny z powodu tego, że muszę zmienić rodzaj bazy danych z mysql na postgresql. Powodem jest to, że tabele mają po 2 miliony rekordów, więc mysql raczej sobie z tym nie poradzi.

konto usunięte

Temat: [InnoDB] Join'y a użycie filesort'a

Mateusz Sokoła:
w sumie to problem trochę jest nieaktualny z powodu tego, że muszę zmienić rodzaj bazy danych z mysql na postgresql. Powodem jest to, że tabele mają po 2 miliony rekordów, więc mysql raczej sobie z tym nie poradzi.

Moje uwagi są raczej uniwersalne ;) w PG też Cię to spotka.

--
Pozdrawiam
Rafał.

konto usunięte

Temat: [InnoDB] Join'y a użycie filesort'a

Problem jest prosty, mysql olewa indeks na entries.added, nie wiem dlaczego to robi.
entries.visible = 'n' jest wymagane, będzie zmienione na 'y'. Zmienić bazę danych raczej i tak muszę, bo mysql nie nadaje się gigantycznych baz danych, a ta już waży 2GB, po miesiącu może nawet 4GB

---
Projektuje wyszukiwarkę plików do możliwych pobrania w technologii p2m.Mateusz Sokoła edytował(a) ten post dnia 19.06.08 o godzinie 00:14

konto usunięte

Temat: [InnoDB] Join'y a użycie filesort'a

Mateusz Sokoła:
Problem jest prosty, mysql olewa indeks na entries.added, nie wiem dlaczego to robi.
entries.visible = 'n' jest wymagane, będzie zmienione na 'y'. Zmienić bazę danych raczej i tak muszę, bo mysql nie nadaje się gigantycznych baz danych, a ta już waży 2GB, po miesiącu może nawet 4GB

---
Projektuje wyszukiwarkę plików do możliwych pobrania w technologii p2m.Mateusz Sokoła edytował(a) ten post dnia 19.06.08 o godzinie 00:14

Dopatrywałbym się błedu raczej u Ciebie niż w mySQL. Masz kilka możliwości wymuszenia ( w twoim przypadku wybrania ) indeksu do złączeń. Czemu nie użyjesz innych kombinacji i nie przetestujesz?
--
Pozdrawiam
Rafał.

konto usunięte

Temat: [InnoDB] Join'y a użycie filesort'a

#1241 - Operand should contain 1 column(s)

Następna dyskusja:

Znikające InnoDB




Wyślij zaproszenie do