Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Web программирование > SQL, базы данных
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.08.2015, 02:13   #1
rustrek
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию Кривой запрос

В общем проблема как всегда начинается когда на сайте появляется много данных, да ещё и запросы кривые.

Помогаю одному человеку, но, что то застрял на одном запросе.

Код:
SELECT SQL_CACHE 9 AS test,N.*,
               (SELECT NAME FROM news_regions where id = N.id_region) AS region,
               (SELECT NAME FROM news_category where id = N.id_category) AS category,
               (SELECT NAME FROM news_sources where id = N.id_source) AS source
               FROM news_news N
                WHERE 1=1
                 AND N.id_category = 2   
                   ORDER BY N.date DESC
                   LIMIT 12600,36;
при таком вот запросе выдаёт Отображает строки 0 - 29 (36 всего, запрос занял 3.0455 сек.) что не есть гуд.

записей в категории 2 где-то около полутора миллионов, вот и буксует.

помогите пожалуйста кто чем может )
rustrek вне форума Ответить с цитированием
Старый 03.08.2015, 07:33   #2
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Цитата:
Сообщение от rustrek Посмотреть сообщение
В общем проблема как всегда начинается когда на сайте появляется много данных, да ещё и запросы кривые.

Помогаю одному человеку, но, что то застрял на одном запросе.

Код:
SELECT SQL_CACHE 9 AS test,N.*,
               (SELECT NAME FROM news_regions where id = N.id_region) AS region,
               (SELECT NAME FROM news_category where id = N.id_category) AS category,
               (SELECT NAME FROM news_sources where id = N.id_source) AS source
               FROM news_news N
                WHERE 1=1
                 AND N.id_category = 2   
                   ORDER BY N.date DESC
                   LIMIT 12600,36;
при таком вот запросе выдаёт Отображает строки 0 - 29 (36 всего, запрос занял 3.0455 сек.) что не есть гуд.

записей в категории 2 где-то около полутора миллионов, вот и буксует.

помогите пожалуйста кто чем может )
Что у вас с индексами по ключам? Часом ребилд делать не надо?
Akeloya вне форума Ответить с цитированием
Старый 03.08.2015, 07:47   #3
rustrek
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Akeloya Посмотреть сообщение
Что у вас с индексами по ключам? Часом ребилд делать не надо?
вот:
Код:
CREATE TABLE IF NOT EXISTS `news_news` (
  `id` int(11) NOT NULL auto_increment,
  `tid` int(11) NOT NULL default '0',
  `id_category` int(11) NOT NULL default '0',
  `id_source` int(11) NOT NULL default '1',
  `id_region` int(11) NOT NULL default '1',
  `date` datetime NOT NULL default '0000-00-00 00:00:00',
  `title` varchar(255) NOT NULL default '',
  `text` longtext NOT NULL,
  `link` varchar(255) NOT NULL default '',
  `image` varchar(255) NOT NULL,
  `counter` int(11) NOT NULL default '0',
  `comment` int(11) NOT NULL default '0',
  `seo_title` varchar(255) NOT NULL,
  `user_id` int(11) NOT NULL,
  `poll` int(11) NOT NULL default '0',
  `hits` int(11) NOT NULL default '0',
  PRIMARY KEY  (`id`),
  KEY `id_category` (`id_category`),
  KEY `image` (`image`),
  KEY `category_image` (`id_category`,`image`),
  KEY `id_region` (`id_region`),
  KEY `date` (`date`),
  KEY `id_source` (`id_source`),
  KEY `counter` (`counter`),
  KEY `region_category` (`id_category`,`id_region`),
  KEY `category_date_source` (`id_category`,`date`,`id_source`),
  KEY `link` (`link`),
  KEY `source_region` (`id_source`,`id_region`),
  KEY `user_id` (`user_id`),
  KEY `hits` (`hits`),
  KEY `counter_cat` (`id_category`,`counter`),
  KEY `hits_cat` (`id_category`,`hits`),
  KEY `cat_date` (`id_category`,`date`),
  KEY `region_date` (`id_region`,`date`),
  KEY `region_category_source_date` (`id_region`,`id_category`,`id_source`),
  KEY `hits_date` (`hits`,`date`),
  KEY `cat_reg_date` (`id_category`,`id_region`,`date`),
  FULLTEXT KEY `FULLTEXT` (`text`,`title`)
) ENGINE=MyISAM  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=2114310 ;
Похоже, что тормозит offset в лимите. но как переписать весь запрос пока опробывал разные варианты, не выходит
rustrek вне форума Ответить с цитированием
Старый 03.08.2015, 08:01   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если LIMIT заремить тормоза будут?
Как выглядит EXPLAIN PLAN?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.08.2015, 08:17   #5
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Наводка для решения проблемы
http://habrahabr.ru/post/44608/
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.08.2015, 08:25   #6
rustrek
 
Регистрация: 16.06.2012
Сообщений: 7
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Если LIMIT заремить тормоза будут?
да, тормоза остаются


Цитата:
Сообщение от Stilet Посмотреть сообщение
Как выглядит EXPLAIN PLAN?
вот


Цитата:
Сообщение от Аватар Посмотреть сообщение
Наводка для решения проблемы
http://habrahabr.ru/post/44608/
но если сделать запрос с LIMIT 36 ; также срабатывает 3-4 секунды

Последний раз редактировалось Stilet; 03.08.2015 в 09:57.
rustrek вне форума Ответить с цитированием
Старый 03.08.2015, 08:33   #7
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
также срабатывает 3-4 секунды
Ну в order by добавить уникальный id. + составной индекс. + во where c учетом date и id
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 03.08.2015, 09:18   #8
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Замените все подзапросы на join'ы, по логике выполнения происходит следующее:
для каждой записи, коих 29 штук, вы выполняете подзапрос с поиском по id, т.е. вы выполняете 29 запросов where по большой таблице. В JOIN вы выполните это всё один раз, так как вы объедените две таблицы по тому же ключу выполнив тот же where один раз сразу для 29 записей.

Кстати, ради интереса, каково время выполнения запроса, если основная таблица запроса - категории, а таблица для подзапросов - news_news?
что-то типа select c.Name Category, (select n.Name from news_news n where n.catedoryId = c.Id) [Name] From categories c

я думаю что намного быстрее

Последний раз редактировалось Akeloya; 03.08.2015 в 09:24. Причина: добавил вопрос про перестановку таблиц
Akeloya вне форума Ответить с цитированием
Старый 03.08.2015, 09:59   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Замените все подзапросы на join'ы
На сколько я понял, план показывает, что подзапросы не дают нагрузки сильной.
ИМХО структура базы не продумана до конца.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 03.08.2015, 10:19   #10
Akeloya
Форумчанин
 
Регистрация: 27.01.2014
Сообщений: 115
По умолчанию

Кстати, в подзапросе нужно указывать top 1, иначе получается, что при пометке новостей парочкой категорий должна быть ошибка, если для одной записи новости в подзапросе будет возвращено 2 категории
Akeloya вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Растеризация кривой Безье. Braun1408 Помощь студентам 4 06.04.2013 18:01
Построение особой кривой K.A.T.A.T-94 Помощь студентам 2 26.03.2012 11:07
Кривой synapse? chikaga Работа с сетью в Delphi 2 15.12.2010 12:03
Кривой макрос Евгений К. Microsoft Office Excel 1 24.08.2010 18:33
Кривой код Slimbr Помощь студентам 0 10.12.2009 18:13