имеется медленный запрос (для 30к постов и 30к юзеров выполняется за 0.2с):
SELECT *
FROM `posts`
JOIN `users` ON ( `posts`.`user_id` = `users`.`id` )
GROUP BY `posts`.`id`
ORDER BY `posts`.`date` DESC
LIMIT 10
описывать стуктуру таблиц не буду полностью, т.к. полей много а на суть вопроса это не влияет, опишу основное — date типа datetime, ID типа int
праймери индексы на posts.id и users.id + индекс на posts.user_id
при таком раскладе запрос выполняется за 0.2с
если поставить индекс на date запрос выполняется все равно за 0.2с
если поставить сортировку по posts.id (что в принципе эквивалентно date), запрос выполняется за 0.001с
если убрать JOIN users запрос выполняется за 0.001с
explain:
без индекса на posts.date, время 0.2с
id |
select_type |
table |
type |
possible_keys |
key |
key_len |
ref |
rows |
Extra |
1 |
SIMPLE |
posts |
index |
user_id |
PRIMARY |
4 |
NULL |
1000 |
Using where; Using temporary; Using filesort |
1 |
SIMPLE |
users |
eq_ref |
PRIMARY |
PRIMARY |
3 |
db_site.posts.user_id |
1 |
Using where |
с индексом на posts.date, время 0.2с
id |
select_type |
table |
type |
possible_keys |
key |
key_len |
ref |
rows |
Extra |
1 |
SIMPLE |
posts |
index |
user_id |
date |
8 |
NULL |
1000 |
Using where; Using temporary |
1 |
SIMPLE |
users |
eq_ref |
PRIMARY |
PRIMARY |
3 |
db_site.posts.user_id |
1 |
Using where |
без сортировки по posts.date, время 0.001с
id |
select_type |
table |
type |
possible_keys |
key |
key_len |
ref |
rows |
Extra |
1 |
SIMPLE |
posts |
index |
user_id |
PRIMARY |
4 |
NULL |
1000 |
Using where |
1 |
SIMPLE |
users |
eq_ref |
PRIMARY |
PRIMARY |
3 |
db_site.posts.user_id |
1 |
Using where |
а теперь внимание, вопрос — как сделать сортировку по дате быстрой? и что я делаю не так…