исправить Использование индекса, Использование временного файла, Использование файловой сортировки

у меня есть такие 3 таблицы. Я пытаюсь присоединиться к ним

    SELECT `t`.`title` AS `category_title`,`t`.`id` AS `category_id`, `st`.`title` AS
 `subcategory_title`, `st`.`id` AS `subcategory_id`, `st`.`parent_id` AS
 `subcategory_parent`, `n`.`title` AS `news_title`,`n`.`id` AS `news_id` FROM
`t_categories` `t` LEFT JOIN t_categories AS `st` ON `st`.`parent_id`=t.`id` LEFT JOIN
 t_newsrelations AS `nr` ON `nr`.`category_id`=st.`id` LEFT JOIN t_news AS `n` ON 
`n`.`id`=nr.`news_id` WHERE `t`.`enabled` = 1 AND `n`.`enabled` = 1 AND `n`.`type`!=1 AND
 `n`.`type`!=5 ORDER BY `t`.`position`,`st`.`position`,`n`.`position` ASC

вот структура таблиц

    CREATE TABLE IF NOT EXISTS `t_categories` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `parent_id` int(11) NOT NULL,
  `title` tinytext NOT NULL,
  `position` tinyint(4) unsigned NOT NULL DEFAULT '0',
  `type` tinyint(1) unsigned NOT NULL,
  `enabled` tinyint(1) unsigned NOT NULL DEFAULT '1',
  UNIQUE KEY `id` (`id`),
  KEY `type` (`type`),
  KEY `parent_id` (`parent_id`),
  KEY `enabled` (`enabled`),
  KEY `id_parent_position_enabled` (`id`,`parent_id`,`position`,`enabled`),
  KEY `position` (`position`),
  KEY `parent_id_2` (`parent_id`,`enabled`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;


CREATE TABLE IF NOT EXISTS `t_news` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `title` tinytext NOT NULL,
  `m_title` tinytext NOT NULL,
  `url` varchar(2000) NOT NULL,
  `keywords` text NOT NULL,
  `description` text NOT NULL,
  `body` longtext NOT NULL,
  `position` tinyint(4) unsigned NOT NULL DEFAULT '0',
  `type` tinyint(1) unsigned NOT NULL,
  `city_id` int(4) NOT NULL,
  `quickmenu_enabled` tinyint(1) unsigned NOT NULL DEFAULT '0',
  `quickmenu` text NOT NULL,
  `enabled` tinyint(1) unsigned NOT NULL DEFAULT '1',
  PRIMARY KEY (`id`),
  UNIQUE KEY `id` (`id`),
  KEY `position` (`position`),
  KEY `type` (`type`),
  KEY `city_id` (`city_id`),
  KEY `url` (`url`(333)),
  KEY `quickmenu_enabled` (`quickmenu_enabled`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 ;


CREATE TABLE IF NOT EXISTS `t_newsrelations` (
  `category_id` int(11) NOT NULL,
  `news_id` int(11) unsigned NOT NULL,
  KEY `category_id` (`category_id`),
  KEY `news_id` (`news_id`),
  KEY `category_id_2` (`category_id`,`news_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

И SELECT EXPLAIN показывает мне

explain-imgt_newsrelations — это промежуточная таблица. Таблица t_categories содержит категории и подкатегории, связанные столбцом parent_id. Каждый элемент из t_news может быть членом более чем одной подкатегории, поэтому они связаны через t_newsrelations.

как оптимизировать запрос? Почему он показывает Использование индекса, Использование временного файла, Использование сортировки файлов?


person Undrooleek    schedule 22.04.2014    source источник
comment
У вас всего 27 записей?   -  person Frazz    schedule 23.04.2014
comment
это пока, я еще не включил рабочий режим сайта   -  person Undrooleek    schedule 23.04.2014
comment
Но вы понимаете, что EXPLAIN зависит от статистики базы данных? Один и тот же запрос с другой заполненной базой данных может привести к другому EXPLAIN. Когда таблицы маленькие, некоторые движки вообще игнорируют индексы и просто читают таблицы последовательно. Вы не можете оптимизировать базу данных, если в ней нет реальных или реалистичных данных (ИМХО).   -  person Frazz    schedule 23.04.2014


Ответы (1)


ORDER BY `t`.`position`,`st`.`position`,`n`.`position` ASC

Вы не можете исключить временную таблицу и файловую сортировку в этом запросе, учитывая имеющиеся у вас таблицы, потому что вы сортируете столбцы из нескольких таблиц. Оптимизация сортировки означает использование индекса, чтобы запрос извлекал строки в нужном вам порядке. Но в MySQL нет возможности создать индекс, охватывающий несколько таблиц.

Единственный способ исправить это — денормализация до тех пор, пока все три столбца не окажутся в одной таблице, и создание одного индекса для трех столбцов. Но денормализация имеет свои недостатки.

person Bill Karwin    schedule 22.04.2014