Войти в систему

Home
    - Создать дневник
    - Написать в дневник
       - Подробный режим

LJ.Rossia.org
    - Новости сайта
    - Общие настройки
    - Sitemap
    - Оплата
    - ljr-fif

Редактировать...
    - Настройки
    - Список друзей
    - Дневник
    - Картинки
    - Пароль
    - Вид дневника

Сообщества

Настроить S2

Помощь
    - Забыли пароль?
    - FAQ
    - Тех. поддержка



Пишет mumuntu ([info]mumuntu)
@ 2010-09-07 13:41:00


Previous Entry  Add to memories!  Tell a Friend!  Next Entry
Простенькая задачка
Дано: MySQL
В нем есть таблица блогозаписей, таблица тегов и таблица связей тег-запись, т.е., ситуация более-менее стандартная.
Требуется: написать запрос(ы), выбирающий 100 первых блогозаписей по тегам "кровь", "любовь", "морковь", "свекровь", отсортированных в порядке написания блогозаписи.
Прежде чем писать в комментарии ответы, посмотрите, пожалуйста, план вашего запроса.
UPD: планы и сами запросы кидайте в комментарии к записи, обсудим.


(Читать комментарии) - (Добавить комментарий)


[info]alexclear@lj
2010-09-07 13:39 (ссылка)
Походу, это единственное, что сработало.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]m_a_m_o_n@lj
2010-09-08 04:16 (ссылка)
Очень интересно узнать, скольно в тестовой базе
постов, тегов и связей. И время по запросам здесь приведённым.

В sakila всего 1000 записей в films, все запросы
слишком быстро отрабатывают что бы разница была видна достоверно.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alexclear@lj
2010-09-08 09:47 (ссылка)

mysql> select count(*) from wp_posts;
+----------+
| count(*) |
+----------+
| 72645 |
+----------+
1 row in set (0.06 sec)

mysql> select count(*) from wp_term_relationships;
+----------+
| count(*) |
+----------+
| 186297 |
+----------+
1 row in set (0.04 sec)

mysql> select count(*) from wp_term_taxonomy;
+----------+
| count(*) |
+----------+
| 17442 |
+----------+
1 row in set (0.00 sec)

Зачем 17442 тегов/категорий, я не знаю, редакторы что-то намудили, в реальности при выборках используется штук может 50, одновременно в запросе - штук 10.

(Ответить) (Уровень выше)


[info]alexclear@lj
2010-09-08 09:49 (ссылка)
> И время по запросам здесь приведённым.

Для исходного, тривиального, около двух секунд.
Для варианта коллеги [info]metaclass@lj - 0.05 секунды для LIMIT 3000,100
Вариант коллеги [info]kvasimodo@lj пришлось прервать, не дождался конца, как и мой вариант с SELECT ... WHERE ID IN(SELECT ...)
Остальные варианты не смотрел.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]m_a_m_o_n@lj
2010-09-08 10:26 (ссылка)
>Для варианта коллеги [info]metaclass - 0.05 секунды для LIMIT 3000,100
mysql> select count(*) from wp_posts;
+----------+
| count(*) |
+----------+
| 72645 |
+----------+
1 row in set (0.06 sec)

Что то я не понимаю, как запрос с full-scan для таблицы posts может
отработать быстрее чем count(*)?

Покажите пожалуйста план.

P.S. У mysql есть фишка, он хорошо кеширует результаты запросов,
то что первый раз он мог считать за 10 секунд, если запрос выполнить
повторно не меняя базу - результат выпадет в миллисекунды.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alexclear@lj
2010-09-08 10:29 (ссылка)
> Что то я не понимаю, как запрос с full-scan для таблицы posts может
отработать быстрее чем count(*)?

Почему с full scan? Там выборка по индексу.
Вот он план.
С увеличением номера страницы будет расти и время.
Для LIMIT 28300, 100 будет около 0.5 секунды.

> P.S. У mysql есть фишка, он хорошо кеширует результаты запросов,
то что первый раз он мог считать за 10 секунд, если запрос выполнить
повторно не меняя базу - результат выпадет в миллисекунды.

Ненене, меня этим не провести, я жду минуты по три между запросами, само собой.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]m_a_m_o_n@lj
2010-09-08 10:45 (ссылка)
Хмм, наверное mysql достаточно умный что бы проверять записи в том
порядке в котором он их выдаёт и остановиться когда хватит.

Интересно, а сколько времени займёт поиск по редкому тегу, для которого
меньше 100 записей в базе?

P.S. >Ненене, меня этим не провести, я жду минуты по три между запросами, само собой.
Можно просто запрос немного исправить, "--" где нибудь добавить или пробелов,
тогда он будет выполнен как новый.

(Ответить) (Уровень выше) (Ветвь дискуссии)


[info]alexclear@lj
2010-09-08 13:02 (ссылка)
> Хмм, наверное mysql достаточно умный что бы проверять записи в том
порядке в котором он их выдаёт и остановиться когда хватит.

Конечно, он же группирует их по индексу.
Как только он наберет резалтсет, он остановится.

> Интересно, а сколько времени займёт поиск по редкому тегу, для которого
меньше 100 записей в базе?

Полный просмотр всего множества, ограниченного первыми двумя условиями.
Там где-то половина всей таблицы и выходит.
То есть, лучше, в данном случае, когда теги часто встречаются - быстрее сотня наберется.

(Ответить) (Уровень выше)


(Читать комментарии) -