SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 07.08.2014 10:40:54

Madgeniy
Участник
Зарегистрирован: 07.08.2014
Сообщений: 4

Нужна помощь в оптимизации запросов.

Здравствуйте все!
Нужна помощь в оптимизации запросов.

Запрос такого вида:


SELECT DISTINCT
    e.* ,
    IF(a_promo.alt_price,
       a_promo.alt_price,
       IF((a_promo.discount >0)AND(a_promo.departament_key =23769),
          a_departaments.DepRetail * a_promo.discount /100,
          IF(e.Key_Sip NOT IN (40823,40824,40838,40839,40840,40841,40842,40843,40844,40845,40846,40825,40847,40848,40849,40850,40851,40852,40853,40854,40826,40855,40856,40857,40858,40859,40860,40861,40827,40862,40863,40864,40865,40866,40867,40868,40869,40828,40870,40871,40872,40873,40874,40875,40876,40877,40829,40878,40879,40880,40830,40881,40882,40883,40884,40831,40885,40886,40887,40888,40889,40890,40891,40892,40832,40893,40894,40895,40896,40897,40833,40898,40899,40900,40901,40902,40835,40903,40904,40905,40906,40907,40908,40909,40910,40911,40836,40912,40913,40914,40915,42490,42491,42500,42501,42502,42503,42504,42505,42492,42506,42507,42508,42509,42510,42511,42493,42512,42513,42494,42514,42515,42516,42517,42495,42518,42496,42519,42520,42521,42522,42523,42524,42525,42526,42497,42527,42528,42529,42530,42531,42532,42533,42534,42498,42535,42536,42537,42538,42539,42499,42540,42541,42542,42543,23224,25302,25303,25304,25305,25307),
             a_departaments.DepRetail* 0.9,
             a_departaments.DepRetail)
         )
       ) AS retailPrice,
    a_departaments.DepRetail
FROM a_elements e
     LEFT JOIN a_promo USING (Key_G)
     LEFT JOIN a_elements_have_images USING (Key_G)
     LEFT JOIN a_departaments USING (Key_G),
     a_elements_epson  
WHERE a_elements_epson.Key_G = e.Key_G
AND e.Key_Sip IN                                                                                                                 (17060,17061,17062,17063,17064,17065,17066,17067,17068,17069,17070,17071,17072,17073,17074,17075,17076,17077,17078,17079,17080,17081,17082,17083,17084,17085,17086,17087,17088,17089,17090,17091,17092,17093,17094,17095,17096,17097,17098,17099,17100,17101,17102,23739,17103,17104,17105,17106,17107,17108,17109,17110,17111,17112,17113,17114,17115,17116,17117,17118,17119,17120,17121,17122,17123,17124,17125,17126,17127,17128,17129)
ORDER BY exist DESC, have_image DESC, valRating ASC, e.Key_Sip DESC
LIMIT 800,10;
 

Работает примерно секунду с небольшим. Может быть нужны дополнительные индексы. Я читал, что использование IF - наименее удачный вариант из возможных. От него я мог бы избавиться, но может быть есть возможность оставить его и использовать доп.индекс?

Спасибо.

Отредактированно Madgeniy (07.08.2014 10:41:50)

Неактивен

 

#2 07.08.2014 12:58:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Нужна помощь в оптимизации запросов.

Выполните запрос с if и без, чтобы понять в нем ли причина.

Покажите структуру таблицы a_elements:
show create table a_elements;

и план запроса:
explain select ...

Неактивен

 

#3 07.08.2014 17:01:38

Madgeniy
Участник
Зарегистрирован: 07.08.2014
Сообщений: 4

Re: Нужна помощь в оптимизации запросов.


show create table a_elements;

CREATE TABLE `a_elements` (
 `Key_G` int(11) NOT NULL,
 `Name` varchar(950) COLLATE utf8_unicode_ci DEFAULT NULL,
 `Retail` float DEFAULT NULL,
 `AnnotFile` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
 `ImageFile` varchar(100) COLLATE utf8_unicode_ci DEFAULT NULL,
 `IncomeDate` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `IsNew` varchar(3) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
 `isLeader` varchar(3) COLLATE utf8_unicode_ci NOT NULL,
 `Qty` int(11) DEFAULT NULL,
 `LocCode` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
 `LocName` varchar(250) COLLATE utf8_unicode_ci DEFAULT NULL,
 `Key_Sip` int(11) DEFAULT NULL,
 `IsActive` varchar(3) COLLATE utf8_unicode_ci NOT NULL DEFAULT '0',
 `valAuthor` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `valPublishing` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `valSerial` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `valYear` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `valISBN` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `valTranslate` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `valPainter` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `valEdition` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
 `valWeight` varchar(11) COLLATE utf8_unicode_ci NOT NULL,
 `valRating` int(11) NOT NULL,
 `isHandled` int(2) NOT NULL,
 `checkString` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
 `last_change` datetime NOT NULL,
 UNIQUE KEY `Key_G` (`Key_G`),
 KEY `Key_Sip` (`Key_Sip`),
 KEY `str2` (`checkString`),
 KEY `strSIP` (`Key_G`,`checkString`),
 KEY `Key_G_2` (`Key_G`,`Retail`,`Qty`,`Key_Sip`),
 KEY `Key_G_3` (`Key_G`,`IsActive`),
 KEY `Key_G_4` (`Key_G`,`Qty`,`IsActive`),
 KEY `valPublishing` (`valPublishing`),
 KEY `Key_G_5` (`Key_G`,`Key_Sip`,`IsActive`,`valSerial`),
 KEY `Key_G_6` (`Key_G`,`Key_Sip`,`IsActive`,`valAuthor`),
 KEY `Key_G_7` (`Key_G`,`Key_Sip`,`IsActive`),
 KEY `Key_G_8` (`Key_G`,`Key_Sip`),
 FULLTEXT KEY `Name` (`Name`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

 


Explain:

http://i.gyazo.com/76db3935f430ff95ec78a1516124235e.png

Сделал без IF - результат по времени тот же.

Неактивен

 

#4 07.08.2014 17:07:02

Madgeniy
Участник
Зарегистрирован: 07.08.2014
Сообщений: 4

Re: Нужна помощь в оптимизации запросов.

Слишком много элементов и много JOINов. Как бы вы посоветовали оптимизировать структуру БД? Еще без сортировки сделал, вполне хороший результат получился. Слишком много приходится сортировать, что видно из explain. Но без сортировки нельзя.

Отредактированно Madgeniy (07.08.2014 17:10:57)

Неактивен

 

#5 07.08.2014 17:39:53

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: Нужна помощь в оптимизации запросов.

По структуре ничего сказать не могу, по названию таблиц сложно сказать о чем вообще это, не то что советовать.

По запросу можно попробовать разбить на 2. Сначала выбрать 10 нужных `Key_G` из первой таблицы, а уже по ним выбирать остальные нужные столбцы.

кстати, что показывает
select @@session.sort_buffer_size;

Неактивен

 

#6 08.08.2014 13:18:20

Madgeniy
Участник
Зарегистрирован: 07.08.2014
Сообщений: 4

Re: Нужна помощь в оптимизации запросов.

Показывает 2097152.
show status like '%Sort_merge_passes%'  показывает 0, так что особо смысла менять нету, я думаю. Буду переделывать запрос или структуру.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson