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 и делает фулскан таблицы. Не понимаю почему? Есть какие-нибудь мысли по этому поводу.
В общем такая проблема... Данных в таблице около 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 и делает фулскан таблицы. Не понимаю почему? Есть какие-нибудь мысли по этому поводу.