Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В. MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум MySQL

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Оптимизация запроса Select
 
 автор: sfairet   (10.12.2008 в 17:14)   письмо автору
27.1 Кб
 
 

Есть запрос в базу. Суть запроса выдавать записи по темам. Одна запись из таблицы может принадлежать ко многим темам.
Таблица stories - содержит сами записи, имеет текстовые поля и поле sid(INT), записей порядка 200
Таблица stories_topics - привязка sid записи(поле news) к id темы(поле topic), записей примерно 400
Таблица topics_big - обеспечивает древо тем и подтем(степень вложенности - 3). Поле big - родительская тема, small - подтема. Записей порядка 200.

Смысл sql запроса выдать все записи из stories, которые находятся в теме с id переданным скриптом(в данном случае 4) или в любой дочерней теме, все дочерние темы записаны в таблице topics_big (максимальная степень вложенности - 3).

Сам запрос:

SELECT SQL_CALC_FOUND_ROWS * FROM stories WHERE sid IN (
SELECT DISTINCT(s.sid) from stories as s
INNER JOIN stories_topics as top ON (s.sid = top.news)
INNER JOIN topics_big as big ON (top.topic = big.small)
LEFT JOIN topics_big as big2 ON (big.big = big2.small)
WHERE (big.big=4
OR big.small=4
OR big2.big=4
OR big2.small=4)
)
ORDER BY anchor, sid DESC limit 0, 20;


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

Пример данных в прикрепленном файле.
Буду рад любой подсказке!

  Ответить  
 
 автор: Trianon   (10.12.2008 в 17:30)   письмо автору
 
   для: sfairet   (10.12.2008 в 17:14)
 

напрашивается как минимум следующее упрощение
SELECT SQL_CALC_FOUND_ROWS * FROM stories WHERE sid IN (
SELECT top.news
FROM stories_topics as top 
INNER JOIN topics_big as big ON (top.topic = big.small)
LEFT JOIN topics_big as big2 ON (big.big = big2.small)
WHERE (big.big=4
OR big.small=4
OR big2.big=4
OR big2.small=4)
)
ORDER BY anchor, sid DESC limit 0, 20;

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования