Подскажите с расстановкой индексов

igor_tp

Новичок
Подскажите с расстановкой индексов

Вот запрос:

SELECT s.id,s.name,u.img,u.siteusername
FROM sift_sifts as s
INNER JOIN sift_rus_siteusers as u ON (u.id=s.user_id AND u.active=1)
WHERE s.active=1 ORDER BY s.create_time LIMIT 0,10



Умные люди! Скажите реально ли выполнять такой запрос, чтобы MySQL не использовал Using temporary; Using filesort. Перебирал разные комбинации индексов, но без толку (может из-за отсутствия в MySQL создавать индексы на полях из разных таблиц?).

И еще такой вопрос - MySQL выдерет пользователей (таблица sift_rus_siteusers) только для 10 записей с учетом LIMIT или пробежит по целой выборке?

Структуру таблиц приводить не буду - она достаточно большая, да и вопрос больше для ознакомления.
 

igor_tp

Новичок
Пользователя могут банить на время, соответственно все его творения тоже забанены - для этого и стоит это условие.
 

Gas

может по одной?
поставь составной индекс (active, create_time) на sift_sifts
и (id,active) на sift_rus_siteusers. Кинь сюда explain запроса после этого.

MySQL выдерет пользователей (таблица sift_rus_siteusers) только для 10 записей с учетом LIMIT или пробежит по целой выборке?
зависит от того какая первая таблица при джойне будет и какие индексы есть. Покажи explain, а там уже видно будет.
 

igor_tp

Новичок
Автор оригинала: Gas
поставь составной индекс (active, create_time) на sift_sifts
и (id,active) на sift_rus_siteusers. Кинь сюда explain запроса после этого.


зависит от того какая первая таблица при джойне будет и какие индексы есть. Покажи explain, а там уже видно будет.
Переписал запрос EXPLAIN SELECT s.id, s.name, u.img, u.siteusername
FROM sift_sifts AS s
USE INDEX ( active )
INNER JOIN sift_rus_siteusers AS u
USE INDEX ( id ) ON ( u.id = s.user_id )
WHERE s.active =1
AND u.active =1
ORDER BY s.create_time
LIMIT 0 , 10

Индекс id (id,active) для таблицы u. Индекс active(active,create_time) EXPLAIN не поправился(

id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE s ref active active 1 const 15 Using temporary; Using filesort
1 SIMPLE u ALL id NULL NULL NULL 4 Using where; Using join buffer

s.user_id и u.id mediumint(11) Интересно, что MySQL даже не воспользовался индексом id - может из-за того что записей еще немного?
 

Gas

может по одной?
убери USE INDEX'ы, не думаю что здесь тот случай, когда стоит mysql'ю подсказывать. Какое количество записей в таблицах?
 

igor_tp

Новичок
Автор оригинала: Gas
убери USE INDEX'ы, не думаю что здесь тот случай, когда стоит mysql'ю подсказывать. Какое количество записей в таблицах?
Спасибо, Gas. Ты правильно начал копать. Оказывается все дело было в недостаточном количестве записей. Просто когда их было мало с самого начала - все было ок, когда их стало чуть больше стала появляться искомая проблема, а когда их стало много (вручную загонял) все стало опять как надо. Я не подумал, не думал что от количества данных (может и от них самих) EXPLAIN может отличаться.
 

С.

Продвинутый новичок
Пользователя могут банить на время, соответственно все его творения тоже забанены - для этого и стоит это условие.
Не важен логический смысл поля. Интересно какую формальную роль оно играет в джойне? Если этого условия не будет в джойне, то что изменится в результате запроса?
 
Сверху