элементарный INNER JOIN жутко тормозит

Духовность™

Продвинутый новичок
элементарный INNER JOIN жутко тормозит

PHP:
SELECT
    SQL_NO_CACHE
    a.*,
    b.name
FROM
    a
INNER JOIN
    b
ON
    a.int_field = b.int_field  // b.int_field - первичный ключ для таблицы b
ORDER BY
    a.id DESC  // a.id - первичный ключ для таблицы a
LIMIT
0, 15
- выдает 2.6 сек. на 100 000 записей.

Если использовать LEFT JOIN то скорость заметно возрастает - около 0.09 сек

Индекс на a.int_field стоит

Explain показывает, что никакие ключи для таблицы b не используются при INNER JOIN. Но почему? :confused:
 

Gas

может по одной?
возможно в таблице `b` намного меньше записей чем в `a` и mysql берёт как её как основную. А там вылазит temporary при сортировке, который в данном случае тормозит. Ну а left join явно задаёт порядок.

Приведи полные explain'ы, чтоб мы не гадали.
И ещё "100 000 записей" звучит совершенно неинформативно, так как у тебя 2 таблицы.
 

Духовность™

Продвинутый новичок
возможно в таблице `b` намного меньше записей
да. их там 17. это города, а таблица `a` - это аптеки, тестовая, я их там сделал 100 000

C explain вот что непонятно: при небольшом объеме таблицы `a` explain такой:

Код:
id  	 select_type  	 table  	 type  	 possible_keys  	 key  	 key_len  	 ref  	 rows  	 Extra
1 	SIMPLE 	a 	index 	int_field 	PRIMARY 	4 	NULL 	274 	 
1 	SIMPLE 	b 	eq_ref 	PRIMARY 	PRIMARY 	2 	new.a.int_field 	1
но стоит её увеличить, хотя бы до 9000 записей, explain показывает:

Код:
id  	 select_type  	 table  	 type  	 possible_keys  	 key  	 key_len  	 ref  	 rows  	 Extra
1 	SIMPLE 	b 	ALL 	PRIMARY 	NULL 	NULL 	NULL 	18 	Using temporary; Using filesort
1 	SIMPLE 	a 	ref 	int_field 	int_field 	2 	new.b.int_field 	158
 

Gas

может по одной?
ага, я так и предпологал, ну оптимизатор считает что так будет лучше :)
тут поможет или left join (если логика позволяет), или straight_join, или force index (но не уверен что это повлияет на оптимизатор в данном случае).
 
Сверху