Запрос с двух таблиц

1. TERGUS5 (02.01.2016 / 23:25)
Помогите пожалуйста составить правильный запрос.

Имеется таблица "a_lenta" в ней хранятся события всех юзеров сайта, такие как добавил фото, песню, видео и т.д.
И ещё имеется таблица "a_subscribers" в ней хранятся user_id подписчиков. Мне нужно вывести с lenta события только тех пользователей, к которым я подписан.

Вот что я сделал:

$sql = "SELECT SQL_CALC_FOUND_ROWS le.* FROM #__lenta as le LEFT JOIN #__subscribers AS fr ON le.user_id = fr.friend_user_id
WHERE fr.user_id = '". USER_ID ."' ORDER BY le.id DESC LIMIT $this->start, $this->per_page";

Этот запрос правильный, но с ним очень долго страницы открываются.
Такое чувство как будто он всю базу гоняет, ну короче долго очень страницу открывает. Не могу понять почему

2. Вантуз-мен (02.01.2016 / 23:32)
1. TERGUS5, запрос нормальный, но думаю SQL_CALC_FOUND_ROWS тебе у тебя не используется, если так, то убирай из запроса и давай сюда EXPLAIN

3. TERGUS5 (02.01.2016 / 23:35)
EXPLAIN SELECT le.* FROM ?

4. Вантуз-мен (03.01.2016 / 10:31)
Да все верно, сделай так и структуру обеих таблиц

5. Вантуз-мен (03.01.2016 / 11:20)
3. TERGUS5, но мне кажется если уберешь SQL_CALC_FOUND_ROWS это должно решить проблему, так как SQL_CALC_FOUND_ROWS сперва просматривает всю таблицу и лишь затем делает выборку по лимитам

6. TERGUS5 (05.01.2016 / 15:23)
5. Vantuz, Что за "структуру обеих таблиц ?" Кинь пожалуйста готовый запрос.

7. TERGUS5 (05.01.2016 / 15:41)
EXPLAIN выводит только 2 непонятных запроса из таблицы

8. Иван (07.01.2016 / 18:44)
А в чём проблема сделать типа SELECT `le`.* FROM `lenta` AS `le` WHERE `le.user_id` IN (SELECT `friend_user_id` WHERE `fr.user_id` = '". USER_ID ."') ORDER BY `le`.`id` DESC LIMIT $this->start, $this->per_page

Или я не правильно понял?

9. TERGUS5 (09.01.2016 / 19:19)
Пишет

SELECT SQL_CALC_FOUND_ROWS `le`.* FROM `a_lenta` AS `le` WHERE `le.user_id` IN (SELECT `friend_user_id` WHERE `fr.user_id` = '1') ORDER BY `le`.`id` DESC LIMIT 0, 10
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'WHERE `fr.user_id` = '1') ORDER BY `le`.`id` DESC LIMIT 0,

10. Вантуз-мен (09.01.2016 / 21:50)
Автор ну покажи структуру 2 таблиц, я же говорю запрос верный, возможно нет индексов, если не используется sql_calc_found_rows убери из запроса

11. TERGUS5 (09.01.2016 / 23:32)
CREATE TABLE IF NOT EXISTS `a_lenta` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`user_id` int(11) NOT NULL,
`to_user` int(11) DEFAULT NULL,
`module` varchar(5000) DEFAULT NULL,
`time` int(11) NOT NULL,
`podaril` enum('yes','no') DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

Добавлено через 00:39 сек.
CREATE TABLE IF NOT EXISTS `a_subscribers` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`friend_user_id` int(11) NOT NULL,
`user_id` int(11) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 ;

12. Вантуз-мен (10.01.2016 / 00:31)
fr.user_id нужны индексы
и fr.friend_user_id тоже желательно

$sql = "le.* FROM a_lenta as le 
LEFT JOIN a_subscribers AS fr ON le.user_id = fr.friend_user_id 
WHERE fr.user_id = '". USER_ID ."' 
ORDER BY le.id DESC 
LIMIT $this->start, $this->per_page";


13. TERGUS5 (10.01.2016 / 09:47)
12. Vantuz, Как его создать? Нужно в таблицу что-то заносить или только в запрос? Подскажи пожалуйста, первый раз с ним сталкиваюсь.

Добавлено через 03:43 сек.
А всё нашел, структура напротив user_id добавить в индекс.

Добавлено через 04:46 сек.
Добавил, и что дальше?

14. Вантуз-мен (10.01.2016 / 10:09)
Ну все напиши тот. Запрос что я дал постом выше и все должно работать быстрее

15. TERGUS5 (10.01.2016 / 10:20)
14. Vantuz, Летает как ракета)) Спасибо большое, выручили. А что если индекс везде использовать? Или почему он не идет по умолчанию.

16. Вантуз-мен (10.01.2016 / 10:30)
Чрезмерные индексы -зло, они увеличивают размер БД, к тому же при вставке обновлении и удалении происходит переиндексирование, на что тоже тратится время, да и не за чем индексы на полях которые не участвуют в выборке

URL: https://visavi.net/topics/42739