Nested sets+get parents

cDLEON

Онанист РНРСlub
Nested sets+get parents

В общем такая проблема... Данных в таблице около 600к
Таблица имеет такой вид:
[sql]
CREATE TABLE `files` (
`file_id` int(11) unsigned NOT NULL auto_increment,
`name` varchar(255) NOT NULL default '',
`file_level` int(11) unsigned default '0',
`file_left` int(11) NOT NULL default '0',
`file_right` int(11) default NULL,
`is_file` char(1) default '0',
`host_id` int(11) default '0',
`parent` int(11) default NULL,
`path` text,
PRIMARY KEY (`file_id`),
KEY `name` USING BTREE (`name`),
KEY `is_file` (`is_file`),
KEY `owner` (`file_level`,`file_left`,`file_right`),
KEY `ind1` (`file_level`,`is_file`,`file_left`),
KEY `file_left` (`file_left`,`file_right`),
FULLTEXT KEY `search_index` (`name`)
) ENGINE=MyISAM AUTO_INCREMENT=559478 DEFAULT CHARSET=utf8[/sql]
Нужно получить список парентов на данную директорию с таким то ИД...
Использую запрос вида:
[sql]
SELECT A.file_id, A.name, CASE WHEN A.file_left + 1 < A.file_right THEN 1 ELSE 0 END AS nflag FROM files A WHERE A.file_left <= (SELECT file_left FROM files WHERE file_id=125844) AND A.file_right>=(SELECT file_right FROM files WHERE file_id=125844) ORDER BY A.file_left
[/sql]
Проблема в том, что когда file_left для файла очень большой, мускуль перестаёт юзать индекс file_left и делает фулскан таблицы. Не понимаю почему? Есть какие-нибудь мысли по этому поводу.
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
наверное, он думает, что фулскан быстрее
а если без подзапросов?
 

cDLEON

Онанист РНРСlub
да я даже статические file_left,file_right подставлял....
Всё равно фулскан.. :(
 

fixxxer

К.О.
Партнер клуба
попробуй force index и сравни explainы и производительность

вообще для мыскля force index это нормально ;) оптимизатор ж туповатый
 

cDLEON

Онанист РНРСlub
На 100к меньше чем при фулскане, но всё равно результат не удовлетворительный :( Запрос 1.5 секи(450к записей) проходит что бы извлечь 3 записи...
 

cDLEON

Онанист РНРСlub
Ок. Вот эксплайн:
[sql]
EXPLAIN SELECT A.file_id, A.name,
CASE WHEN A.file_left +1 < A.file_right
THEN 1
ELSE 0
END AS nflag
FROM files A
FORCE INDEX ( file_left )
WHERE A.file_left <= (
SELECT file_left
FROM files
WHERE file_id =125844 )
AND A.file_right >= (
SELECT file_right
FROM files
WHERE file_id =125844 )
ORDER BY A.file_left
[/sql]
Код:
1  	PRIMARY  	A  	range  	file_left  	file_left  	4  	NULL  	126045  	Using where
3 	SUBQUERY 	files 	const 	PRIMARY 	PRIMARY 	4 	  	1 	 
2 	SUBQUERY 	files 	const 	PRIMARY 	PRIMARY 	4 	  	1
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
а с константами вместо подзапросов какое время?
 

Fortop

Новичок
cDLEON
Тут смотрели?
http://dev.mysql.com/doc/refman/5.0/en/in-subquery-optimization.html
 

zerkms

TDD infected
Команда форума
grigori
константы ничего не изменят

WHERE A.file_left <= CONST AND A.file_right >= CONST

всегда при работе сможет использовать либо поиск по одному полю, либо по-другому.

а т.к. он находится где-то в первой третьей части дерева, то понятно, что A.file_left <= CONST будет порядка
на мой неискушённый взгляд - ничего сделать не получится.
 

cDLEON

Онанист РНРСlub
В общем всё разрешилось. НО не оптимизацией запроса.
А тормозить начало, как оказалось, после переезда на 5-ю версию мускуля. Пересоздали таблицу - la сервера упал, и всё залетало...
 

Wicked

Новичок
что довольно странно, потому что в целом-то zerkms-то прав :)
 
Сверху