Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Помогите ускорить запрос

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Помогите ускорить запрос
miha25
Отправлено: 20 Ноября, 2015 - 16:30:28
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Нояб. 2015  


Помог: 0 раз(а)




Здравствуйте!

Есть две таблицы на 500000 записей:

CODE (SQL):
скопировать код в буфер обмена
  1. jb_board        CREATE TABLE `jb_board` (
  2.  `id` int(7) NOT NULL AUTO_INCREMENT,
  3.  `id_category` smallint(3) NOT NULL,
  4.  `user_id` int(6) NOT NULL DEFAULT '0',
  5.  `type` enum('s','p','u','o','a','v','r','m') DEFAULT 'p',
  6.  `autor` varchar(30) NOT NULL,
  7.  `title` varchar(70) NOT NULL,
  8.  `email` varchar(40) NOT NULL,
  9.  `subscribe` enum('yes','no') CHARACTER SET cp1251 NOT NULL DEFAULT 'yes',
  10.  `city` text NOT NULL,
  11.  `city_id` smallint(3) NOT NULL,
  12.  `url` varchar(255) NOT NULL,
  13.  `click` smallint(6) NOT NULL DEFAULT '0',
  14.  `contacts` text NOT NULL,
  15.  `text` text NOT NULL,
  16.  `price` int(11) NOT NULL DEFAULT '1',
  17.  `price_val` text NOT NULL,
  18.  `video` varchar(128) NOT NULL,
  19.  `hits` int(11) NOT NULL DEFAULT '0',
  20.  `c_phone` int(11) NOT NULL DEFAULT '0',
  21.  `old_mess` enum('new','old') NOT NULL DEFAULT 'new',
  22.  `checked` enum('yes','no','edit','del') NOT NULL DEFAULT 'no',
  23.  `checkbox_top` smallint(1) NOT NULL DEFAULT '0',
  24.  `top_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  25.  `send_notice_vip_sms` smallint(1) NOT NULL DEFAULT '0',
  26.  `checkbox_select` smallint(1) NOT NULL DEFAULT '0',
  27.  `select_time` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  28.  `send_notice_select_sms` smallint(1) NOT NULL DEFAULT '0',
  29.  `tags` text NOT NULL,
  30.  `send_notice_day` smallint(1) NOT NULL DEFAULT '0',
  31.  `time_delete` smallint(6) NOT NULL DEFAULT '30',
  32.  `date_add` datetime NOT NULL,
  33.  `ip` text NOT NULL,
  34.  `gmaps` varchar(255) NOT NULL,
  35.  `cat_fields` text NOT NULL,
  36.  PRIMARY KEY (`id`),
  37.  KEY `id_category` (`id_category`),
  38.  KEY `date_add` (`date_add`),
  39.  FULLTEXT KEY `title` (`title`)
  40. ) ENGINE=MyISAM AUTO_INCREMENT=1308742 DEFAULT CHARSET=utf8 PACK_KEYS=0 CHECKSUM=1
  41.  


и

CODE (SQL):
скопировать код в буфер обмена
  1. jb_photo        CREATE TABLE `jb_photo` (
  2.  `id_photo` int(6) NOT NULL AUTO_INCREMENT,
  3.  `id_message` int(8) NOT NULL DEFAULT '0',
  4.  `photo_name` varchar(255) NOT NULL,
  5.  `date` text NOT NULL,
  6.  PRIMARY KEY (`id_photo`),
  7.  KEY `photo_name` (`photo_name`),
  8.  KEY `id_message` (`id_message`)
  9. ) ENGINE=MyISAM AUTO_INCREMENT=951960 DEFAULT CHARSET=utf8


есть запрос который отрабатывает очень медленно больше 1.5 сек

CODE (SQL):
скопировать код в буфер обмена
  1. SELECT STRAIGHT_JOIN DISTINCT jb_board.id AS board_id, DATE_FORMAT( jb_board.date_add, '%d.%m.%Y' ) AS dateAdd, jb_board.id_category, jb_board.title, jb_board.price, jb_board.price_val, jb_board.city
  2. FROM jb_board
  3. USE INDEX ( date_add )
  4. LEFT JOIN jb_photo ON jb_board.id = jb_photo.id_message
  5. WHERE jb_photo.photo_name != ''
  6. AND old_mess = 'old'
  7. AND jb_board.id_category
  8. IN ( 398, 94, 95, 96, 97, 98, 99, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199 )
  9. AND jb_board.id_category !=405
  10. ORDER BY date_add DESC
  11. LIMIT 0 , 20


если убрать ORDER by date_add, все просто летает, с ним тормозит, перелопатил много инфы, но так и не смог решить проблему

вот EXPLAIN запроса

на знаю как правильно его сюда вставить поэтому прикрепил скрин EXPLAIN

Помогите пожалуйста разобраться
Прикреплено изображение (Нажмите для увеличения)
Снимок.PNG

(Отредактировано автором: 20 Ноября, 2015 - 16:31:20)

 
 Top
Мелкий Супермодератор
Отправлено: 20 Ноября, 2015 - 17:14:53
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Очень, мягко выражаясь, странный запрос.
Дофига указаний оптимизатору для простого запроса почти наверняка будут мешать, а не помогать.
left join, но затем фильтруете по приджойненой таблицы без учёта null'ов - только мешаете и без того глупому оптимизатору работать.
С какого перепугу эти, хоть и небольшие таблицы, в 2015 году на myisam я вообще не пойму.
Про subscribe в cp1251 помолчу.

В общем, что от запроса вообще нужно?
выбрать 20 записей по дате из jb_board с учётом выбранных категорий и только те, у которых есть строки в jb_photo?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT jb_board.id AS board_id, DATE_FORMAT( jb_board.date_add, '%d.%m.%Y' ) AS dateAdd, jb_board.id_category, jb_board.title, jb_board.price, jb_board.price_val, jb_board.city
  2. FROM jb_board
  3. WHERE EXISTS (SELECT 1 FROM jb_photo WHERE jb_board.id = jb_photo.id_message)
  4. AND jb_board.id_category
  5. IN ( 398, 94, 95, 96, 97, 98, 99, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199 )
  6. ORDER BY date_add DESC
  7. LIMIT 0 , 20

Возможно, имеет смысл вынести в jb_board булево поле, существуют ли для этой записи строки в jb_photo.


-----
PostgreSQL DBA
 
 Top
miha25
Отправлено: 20 Ноября, 2015 - 17:18:25
Post Id


Новичок


Покинул форум
Сообщений всего: 20
Дата рег-ции: Нояб. 2015  


Помог: 0 раз(а)




Мелкий пишет:
Очень, мягко выражаясь, странный запрос.
Дофига указаний оптимизатору для простого запроса почти наверняка будут мешать, а не помогать.
left join, но затем фильтруете по приджойненой таблицы без учёта null'ов - только мешаете и без того глупому оптимизатору работать.
С какого перепугу эти, хоть и небольшие таблицы, в 2015 году на myisam я вообще не пойму.
Про subscribe в cp1251 помолчу.

В общем, что от запроса вообще нужно?
выбрать 20 записей по дате из jb_board с учётом выбранных категорий и только те, у которых есть строки в jb_photo?
CODE (SQL):
скопировать код в буфер обмена
  1. SELECT jb_board.id AS board_id, DATE_FORMAT( jb_board.date_add, '%d.%m.%Y' ) AS dateAdd, jb_board.id_category, jb_board.title, jb_board.price, jb_board.price_val, jb_board.city
  2. FROM jb_board
  3. WHERE EXISTS (SELECT 1 FROM jb_photo WHERE jb_board.id = jb_photo.id_message)
  4. AND jb_board.id_category
  5. IN ( 398, 94, 95, 96, 97, 98, 99, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199 )
  6. ORDER BY date_add DESC
  7. LIMIT 0 , 20

Возможно, имеет смысл вынести в jb_board булево поле, существуют ли для этой записи строки в jb_photo.


Здравствуйте, да нужно выбрать 20 записей по дате из jb_board с учётом выбранных категорий и только те, у которых есть строки в jb_photo, что касается вынести в jb_board булево поле, я к сожалению чайник в этом деле, поэтому не пойму о чем Вы


Спасибо Вам большое за помощь, поставил Ваш запрос, отрабатывает за 0.0044, супер.


Подскажите, а что Вы имели ввиду когда писали

С какого перепугу эти, хоть и небольшие таблицы, в 2015 году на myisam я вообще не пойму.

объясните пожалуйста если не трудно

(Отредактировано автором: 20 Ноября, 2015 - 17:25:41)

 
 Top
Мелкий Супермодератор
Отправлено: 20 Ноября, 2015 - 17:42:50
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Я к тому, что уже 2015 год кончается. Причин использовать всякое myisam вместо нормального innodb нет уже почти 4 года, даже если требуется fulltext. А без полнотекстовых индексов - все 10 лет.


-----
PostgreSQL DBA
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« SQL и Архитектура БД »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB