Xpoint
   [напомнить пароль]

Подскажите с использование индексов

Метки: [без меток]
[арх]
2008-04-11 00:02:32 [обр] Владимир Михайленко(0/33)[досье]

Структура БД:

CREATE TABLE `catalog_categories` (
  `id` int(11) NOT NULL auto_increment,
  `name` varchar(255) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=58 DEFAULT CHARSET=utf8 AUTO_INCREMENT=58 ;

CREATE TABLE `catalog_categories_tree` (
  `id` int(11) NOT NULL auto_increment,
  `category_id` int(11) NOT NULL,
  `leftKey` int(11) NOT NULL,
  `rightKey` int(11) NOT NULL,
  `level` int(11) NOT NULL,
  `parent_id` int(11) NOT NULL,
  PRIMARY KEY  (`id`),
  UNIQUE KEY `category_id` (`category_id`),
  KEY `leftKey` (`leftKey`),
  KEY `rightKey` (`rightKey`),
  KEY `level` (`level`),
  KEY `parent_id` (`parent_id`)
) ENGINE=MyISAM AUTO_INCREMENT=59 DEFAULT CHARSET=cp1251 AUTO_INCREMENT=59 ;

Запрос:

SELECT `catalog_categories_tree`.`level` , `catalog_categories_tree`.`parent_id` , `catalog_categories`.`name` 
FROM `catalog_categories_tree` , `catalog_categories` 
WHERE catalog_categories.id = catalog_categories_tree.category_id
ORDER BY `catalog_categories_tree`.`leftKey` ASC

DESCRIBE показывает при джойне catalog_categories.id = catalog_categories_tree.category_id:
Using temporary; Using filesort ( http://hosting04.imagecross.com/image-hosting-01/7872mysql.jpg )

Насколько я понимаю, индексов я понасоздавал, но они не используются... Как можно исправить ситуацию?

спустя 10 часов [обр] Dennis F. Latypoff aka funky_dennis(22/84)[досье]
у Вас отсутствует явное WHERE условие для основной таблицы, поэтому mysql делает readahead этой таблицы, для этого индекс не нужен, индекс используется у присоединяемой таблицы. как-то так
спустя 2 часа 14 минут [обр] Александр Галкин(18/211)[досье]
Сам не пробовал, но что если сделать вот так?
SELECT t.`level`, t.`parent_id`, c.`name` 
FROM `catalog_categories_tree` t
INNER JOIN `catalog_categories` c ON c.id = t.category_id
ORDER BY t.`leftKey` ASC
спустя 39 минут [обр] Дмитрий Попов(50/509)[досье]

Угу.

  1. Посоздавать можно сколько угодно индексов. Но использоваться на каждую таблицу может только один
  2. MySQL все равно придется делать выборку каждого значения из главной таблицы для джойна, соответственно индекс тут не используется - отсюда и идет temporary и отсюда же filesort.

Вариант от Александр Галкин[досье] мне кажется не поможет (хотя попробуйте).

спустя 2 часа 43 минуты [обр] Владимир Михайленко(0/33)[досье]
Александр Галкин[досье], тот же результат. В таком виде, кстати, изначально запрос и был :)
спустя 17 минут [обр] Владимир Михайленко(0/33)[досье]
Dennis F. Latypoff aka funky_dennis[досье], я правильно понимаю, что MySQL сначала выбирает весь catalog_categories, затем присоединяет catalog_categories_tree и лишь потом делает сортировку по leftKey? Т.е. главная ли это или присоединяемая таблица определяет MySQL?
спустя 23 часа [обр] Dennis F. Latypoff aka funky_dennis(22/84)[досье]
да
Powered by POEM™ Engine Copyright © 2002-2005