Завал с join'ом

Phristen

Новичок
Завал с join'ом

Джойню две таблицы (в одной 30кб, в другой 92мб) по полям типа unsigned bigint (в той таблице что 30кб это primary key), запрос длится от 10 до 70 секунд :confused: Причём, тип джойна (left/right/cross) не влияет на время обработки абсолютно.
Что это может быть?

P.S. Запрос выглядит так:
[sql]
SELECT a.title, a.id, COUNT(b.id) AS cnt FROM a
LEFT JOIN b ON a.id=b.ct
GROUP BY a.id
[/sql]
P.P.S. В таблице "a" всего 220 записей.
 

berkut

Новичок
а если создать индекс на поле, по которому идёт объеденение, в таблице 92 мб
 

Phristen

Новичок
а если создать индекс на поле, по которому идёт объеденение, в таблице 92 мб
Индекс и так есть.

А explain вот:
Код:
table 	type	possible_keys	key	 key_len  	 ref	 rows		 Extra
a 	ALL 	PRIMARY 	NULL 		NULL 	NULL	 226 		Using temporary; Using filesort
b 	ref 	ct 		ct 		8 	a.id 	141 		Using where
Вроде ничего подозрительного?

P.S. В таблице b ещё делаю where по дате, но без него тормозит точно так-же.
 

chira

Новичок
Phristen

есть сомнения, что таблицы у тебя называются a & b, давай реальный запрос
 

Phristen

Новичок
есть сомнения, что таблицы у тебя называются a & b
Нет конечно. Они называются a & c :)
[sql]SELECT c.title, c.parent, c.id, COUNT(a.id) AS cnt
FROM cat AS c LEFT JOIN art AS a ON a.cat = c.id
WHERE a.level<=0
GROUP BY c.id
ORDER BY c.prv[/sql]Замечу, что если where и order by убрать, то ничего не изменится.

P.S. Да, кстати. 92 мб туда бухнули одним залпом, может БД ещё, как бы это назвать, не оптимизировалась? А то сейчас вроде чуток побыстрее стало - в порядке 6-12 секунд, но по сравнению с остальными запросами (даже из той-же таблицы) всё равно ужасно медленно :mad:
 

phprus

Moderator
Команда форума
Phristen
Может быть надо выбирать из art, а к ней уже при JOINивать cat.
Тоесть как то так (правильность не гарантирую, но идея должна быть понятна):

[sql]
SELECT a.*, c.title, c.parent, c.id, COUNT( a.id ) AS cnt
FROM art AS a
LEFT JOIN cat AS c ON c.id = a.cat
WHERE a.level <= 0
GROUP BY c.id
ORDER BY c.prv
[/sql]

А то похоже что у тебя вначале обе таблици склеиваются и только потом происходит отбор нужных данных.
 

Ermitazh

Новичок
Phristen
выполни запрос по кускам...без GROUP BY насколько быстрее выполняется запрос?
 

Phristen

Новичок
Может быть надо выбирать из art, а к ней уже при JOINивать cat.
Тоесть как то так (правильность не гарантирую, но идея должна быть понятна):
Нет, не помогло :(

выполни запрос по кускам...без GROUP BY насколько быстрее выполняется запрос?
О! Без група получается раз в 50 быстрее :) И это с учётом того, что возвращаются 28000 рядов.

И что же это значит? Я же группирую по числовому полю, т.е. операция сравнения должна быть быстрой?

P.S. Кстати, тормозит только первый раз, а потом летает. Т.е. я так понимаю, пока на сервере что-то закэшировано (что?), то всё ok, а как только оно из памяти выгружается, сразу наступает ппц.
P.P.S. Вот подождал пять минут, жму релоад, и опять время выполнения 30 секунд :)
 

Phristen

Новичок
Ну сделал force index, для проформы. Explain стал:
Код:
[b]
table  	 type  	 possible_keys  	 key  	 key_len  	 ref  	 rows  	 Extraх[/b]
c 	index 		PRIMARY 	PRIMARY 	8 	NULL 	226 	Using temporary; Using filesort
a 	ref 		cat 		cat 		8 	c.id 	141 	Using where
Только на время выполнения это не повлияло ничуть :(
В-общем, идей больше ни у кого нет?
 

alpine

Новичок
Phristen
Попробуй так:
[sql]
SELECT c.title, c.parent, c.id, IFNULL(a1.cnt, 0) as cnt
FROM cat AS c
LEFT JOIN (
SELECT a.id, COUNT(*) as cnt
FROM art as a
WHERE a.level <= 0
GROUP BY a.id
) as a1 ON (a1.id=c.id)
ORDER BY c.prv
[/sql]
 

Phristen

Новичок
OPTIMIZE TABLE и REPAIR TABLE
Не-а...

[sql]SELECT c.title, c.parent, c.id, IFNULL( a1.cnt, 0 ) AS cnt
FROM cat AS c
LEFT JOIN (

SELECT a.id, COUNT( * ) AS cnt
FROM art AS a
WHERE a.level <= 0
GROUP BY a.id
) AS a1 ON ( a1.id = c.id )
ORDER BY c.prv[/sql]
Там версия mysql 4.0.27 стоит.
Пора, похоже, валить с этого хостинга нафик.

Впрочем, мысль хорошая. Одним запросом взять c.title, другим COUNT(a.id), и потом средствами php их сопоставить... Мороки, конечно, это добавляет.
 

Breeze

goshogun
Команда форума
Партнер клуба
Phristen
а покажи-ка

show create table cat;

и

show create table art;
 
Сверху