MYSQL: Прошу помощи в оптимизации запроса

245
21 марта 2018, 02:50

Привет, прошу помощи в оптимизации запроса, индекса или таблицы в целом... Есть запрос

SELECT DISTINCT i.`id`, i.`name`
FROM `p_items` as i, `p_cats_sync` as c 
WHERE c.`id` = i.`id` 
  AND c.`cat_id` IN (109,152,153,156,157,158,161,163,166,140,266) 
  AND c.`status` = 1 
  AND c.`p_status` = 1 
ORDER BY i.`status` DESC, i.`views` DESC 
LIMIT 40, 10;

EXPLAIN:

id  select_type     table   type    possible_keys   key     key_len     ref     rows    Extra   
1   SIMPLE  c   range   PRIMARY,id  PRIMARY     4   NULL    412     Using where; Using index; Using temporary; Using f...
1   SIMPLE  i   ref     PRIMARY     PRIMARY     3   c.id    1

Таблицы:

CREATE TABLE IF NOT EXISTS `p_items` (
  `id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT,
  `name` varchar(200) NOT NULL,
  `status` tinyint(1) unsigned NOT NULL,
  `views` smallint(5) unsigned NOT NULL,
  PRIMARY KEY (`id`,`status`,`views`),
  UNIQUE KEY `status` (`status`,`views`,`id`),
  KEY `views` (`views`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=2594 ;
CREATE TABLE IF NOT EXISTS `p_cats_sync` (
  `id` mediumint(8) unsigned NOT NULL COMMENT '',
  `cat_id` smallint(5) unsigned NOT NULL COMMENT '',
  `status` tinyint(1) unsigned NOT NULL COMMENT '',
  `p_status` tinyint(1) NOT NULL COMMENT '',
  PRIMARY KEY (`cat_id`,`status`,`p_status`,`id`),
  KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

Запрос выполняется очень долго (~0.4-0.5s), даже на не очень большой БД (порядка 1400 записей) Пробовал просто запрос

EXPLAIN SELECT DISTINCT c.`id`
FROM `p_cats_sync` AS c
WHERE c.`cat_id` IN ( 109, 152, 153, 156, 157, 158, 161, 163, 166, 140, 266 )
  AND c.`status` =1
  AND c.`p_status` =1

Выполняется быстро, хоть и с временной таблицей, убрать ее не получается :(

1   SIMPLE  c   range   PRIMARY     PRIMARY     4   NULL    412     Using where; Using index; Using temporary

Прошу помощи в оптимизации, т.к. количество записей растет очень быстро

READ ALSO
Вставка если нет дубликатов

Вставка если нет дубликатов

Есть два столбца, это id(AUTO_INCREMENT) и text(TEXT)Как при добавлении строчки(INSERT) проверять уникальность text, и если найден дубликат то ничего не делать...

153
Слияние двух массивов в один массив - C#

Слияние двух массивов в один массив - C#

У меня есть два массива:

193
Получить объект из списка по свойству

Получить объект из списка по свойству

Добрый день, имеется список объектов (Photo, Video, Gallery, PhotoMode, VideoMode)Как можно получить галерею по её имени? Пока что идея такая:

219
Побайтная запись данных в структуру С#

Побайтная запись данных в структуру С#

Есть структура данных (С#) необходимо принимая данные из SerialPort записать их в структуру побайтно

205