2010-04-10 2 views
2
select SQL_CALC_FOUND_ROWS DISTINCT media.*, username 
from album as album, album_permission as permission, user as user, media as media , word_tag as word_tag, tag as tag 
where ((media.album_id = album.album_id and album.private = 'yes' and album.album_id = permission.album_id and (permission.email = '' or permission.user_id = '')) or (media.album_id = album.album_id and album.private = 'no') or media.album_id = '0') 
and media.status = '1' 
and media.user_id = user.user_id 
and word_tag.media_id = media.media_id 
and word_tag.tag_id = tag.tag_id 
and tag.name in ('justin','bieber','malfunction','katherine','heigl','wardrobe','cinetube') and media.media_type = 'video' 
and media.media_id not in ('YHL6a5z8MV4') 
group by media.media_id 
order by RAND() 
#there is limit too, by 20 rows.. 

Я не знаю, с чего начать объяснять этот вопрос, но, пожалуйста, простите меня и спросите, есть ли у вас какие-либо вопросы. нижеследующий - описание.Сложный процесс создания запроса чрезвычайно медленный

SQL_CALC_FOUND_ROWS вычисляет, сколько строк существует и будет использоваться для разбивки на страницы, поэтому оно учитывает общие записи, даже пока показывается только 20.

DISTINCT остановит повторную строку для отображения.

имя пользователя из таблицы пользователя.

альбом, альбом_передача. его проверка, если альбом является приватным, и если это так, тогда проверьте, имеет ли пользователь разрешение, user_id.

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

im действительно разочарован этим запросом, и сайт очень медленный или не открывающий иногда причину этого запроса. пожалуйста, помогите

SQL query: EXPLAIN select SQL_CALC_FOUND_ROWS DISTINCT media.*, username from album as album, album_permission as permission, user as user, media as media , word_tag as word_tag, tag as tag where ((media.album_id = album.album_id and album.private = 'yes' and album.album_id = permission.album_id and (permission.email = '' or permission.user_id = '')) or (media.album_id = album.album_id and album.private = 'no') or media.album_id = '0') and media.status = '1' and media.user_id = user.user_id and word_tag.media_id = media.media_id and word_tag.tag_id = tag.tag_id and tag.name in ('justin','bieber','malfunction','katherine','heigl','wardrobe','cinetube') and media.media_type = 'video' and media.media_id not in ('YHL6a5z8MV4') group by media.media_id order by RAND() ; 
Rows: 6 
id select_type table type possible_keys key key_len ref rows Extra 
1 SIMPLE permission system album_id NULL NULL NULL 1 Using temporary; Using filesort 
1 SIMPLE album ALL PRIMARY NULL NULL NULL 68 
1 SIMPLE word_tag ALL media_id NULL NULL NULL 88383 Using where; Using join buffer 
1 SIMPLE media eq_ref media_id,album_id media_id 34 _site.word_tag.media_id 1 Using where 
1 SIMPLE tag eq_ref PRIMARY PRIMARY 4 _site.word_tag.tag_id 1 Using where 
1 SIMPLE user eq_ref PRIMARY PRIMARY 34 _site.media.user_id 1 

структуру таблицы http://pastie.org/912388 Эта ссылка таблицы дамп, который вы можете сделать в PHPMyAdmin или запустить его и посмотреть структуру таблиц.

+0

Невозможно дать конкретную помощь, основанную на том, что вы сказали до сих пор. У вас есть соответствующие индексы на таблицах альбом, альбом_переход, пользователь, медиа, word_tag, тег? –

+0

Я добавил объяснение, помогает ли это? – Basit

+0

Я также добавил ссылку на структуру таблицы – Basit

ответ

3

Самое лучшее, что вы можете сделать, это запустить запрос, но поставить перед ним EXPLAIN и проанализировать результаты.

Не зная структуры (особенно индексов) всех таблиц в этом запросе, нам будет трудно дать вам хороший ответ.

Начать с этого: Optimizing Queries with EXPLAIN.

Если вы не можете добиться успеха, следуя рекомендациям, разместите структуры своих таблиц, и мы, возможно, вам поможем.

+0

Я добавил объяснение из phpmyadmin, это помогает? – Basit

+0

Я также добавил ссылку на структуру таблицы – Basit

0

Вы пытались удалить «ORDER BY RAND()», чтобы узнать, имеет ли это значение?

+0

Да, я просто попробовал, и нет, это не имело никакого значения. – Basit

1

Я начал бы с того, что поместил ORDER BY RAND(). Это огромный убийца. См. http://www.paperplanes.de/2008/4/24/mysql_nonos_order_by_rand.html и http://jan.kneschke.de/projects/mysql/order-by-rand/.

Я предлагаю сделать рандомизацию в вашем коде после того, как вы выберете результаты.

+0

Я удалил rand, но сайт все еще медленный. возможно, его теги !!! – Basit

1

Отказ от ответственности: Я обычно работаю с SQL Server, а не с MySQL, и это первый раз, когда я пытался интерпретировать MySQL Explain plan! В частности, я предполагаю, что его следует читать сверху донизу. Пожалуйста, кто-то поправьте меня, если я ошибаюсь!

Но если у меня есть правильная подборка, он говорит для таблицы word_tag, что у нее есть 88383 строки. Был один возможный индекс, который он мог бы выбрать (возможно_keys = media_id), но фактически решил не использовать индекс вообще (key = null).

Причина этого, как представляется, что единственное, что в запросе, что может ограничить количество строк, возвращаемых из word_tag ​​является объединением word_tag.media_id = media.media_id and word_tag.tag_id = tag.tag_id, но ни media ни tag просматриваются до позже. Можете ли вы рассказать мне, сколько строк у обеих этих таблиц?

Редактировать: На самом деле 34 и 4 строки показаны в EXPLAIN.Что делать, если вы добавите индекс на word_tag, содержащий оба столбца tag_id и media_id? Если это не изменит план, попробуйте запустить таблицу анализа в этих таблицах http://dev.mysql.com/doc/refman/5.0/en/analyze-table.html

Также.

  1. Сколько строк имеет результирующий набор возврат, если вы удалите LIMIT (то есть то, что это значение SQL_CALC_FOUND_ROWS)?

  2. Как насчет удаления DISTINCT? Сколько строк тогда?

+0

хорошо с или без, он показывает около 300 строк. я удалил SQL_CALC_FOUND_ROWS и даже группу по порядку. но он все еще медленный, и я получаю msg «Исключение: завершение работы сервера». есть идеи? – Basit

0

Есть некоторые дискуссии продолжаются о влиянии на производительность использования SQL_CALC_FOUND_ROWS:

http://www.mysqlperformanceblog.com/2007/08/28/to-sql_calc_found_rows-or-not-to-sql_calc_found_rows/

Проверьте свой запрос отключить эту опцию, чтобы увидеть, если это делает разницу (в исполнении). Если это так, вам может потребоваться найти другой способ узнать, сколько строк имеет набор результатов.

+0

Я сделал это, он показал несколько лучшую производительность, но сайт все еще медленный. : / – Basit

Смежные вопросы