У меня сложный запрос, который я не могу оптимизировать с помощью правильных индексов. Любые идеи о том, как изменить запрос или индексы для оптимизации. columndata
таблица содержит 55000 записей, drows
d - 4000 записей, остальные таблицы - менее 25 записей. Как вы должны подойти к оптимизации такой проблемы:
SELECT DISTINCT a.id,
a.string_data,
b.grid_id,
c.data_type,
d.document_id
FROM `columndata` a,
`columngrid` b,
`dcolumns` c,
`drows` d
WHERE b.grid_id = 9
AND d.document_id = 17
AND d.id = a.row_number
AND b.column_id = a.column_id
AND c.id = a.column_id
AND 0 = (SELECT count(1) AS q
FROM `security` e,
`role_userlist` f,
`user_type_defaults`g
WHERE ((e.access_for = 1
AND e.access_for_id = 0)
OR (e.access_for = 2
AND e.access_for_id = f.role_id
AND f.userid = 0)
OR (e.access_for = 3
AND e.access_for_id = g.id
AND (g.usertype_name =""
OR (g.usertype_name = "Guest"
AND 0 = 0))))
AND e.access_level = 0
AND ((e.access_type = 2
AND e.access_subtype_grid_id = b.grid_id
AND e.access_subtype_column_id = a.column_id)
OR (e.access_type = 4
AND e.access_subtype_document_id = a.document_id
AND e.access_subtype_column_id = a.column_id)))
ORDER BY d.ordering, b.ordering LIMIT 0, 330
Столы
CREATE TABLE `columndata` (
`id` int(11) NOT NULL auto_increment,
`document_id` int (11) NOT NULL,
`column_id` int(11) NOT NULL,
`row_number` int(11) NOT NULL,
`string_data` varchar (5000),
PRIMARY KEY (`id`),
INDEX(`column_id`,`row_number`,`document_id`),
INDEX(`row_number`),
INDEX(`document_id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
CREATE TABLE `columngrid` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11),
`column_id` int(11) NOT NULL,
`grid_id` int(11) NOT NULL,
`ordering` int(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX (`parent_id`),
INDEX (`grid_id`,`column_id`,`ordering`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
CREATE TABLE `dcolumns` (
`id` int(11) NOT NULL auto_increment,
`header` varchar(25) NOT NULL,
`data_type` varchar (25) NOT NULL default 'T',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
CREATE TABLE `drows` (
`id` int(11) NOT NULL auto_increment,
`parent_id` int(11),
`document_id` int (11) NOT NULL,
`grid_id` int(11) NOT NULL,
`ordering` int(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX (`parent_id`),
INDEX (`document_id`,`id`,`ordering`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
CREATE TABLE `security` (
`id` int(11) NOT NULL auto_increment,
`access_for` int(11) NOT NULL,
`access_for_id` int(11) NOT NULL,
`access_type` int(11) NOT NULL,
`access_type_id` varchar(11) NOT NULL,
`access_subtype_grid_id` int(11) NULL,
`access_subtype_column_id` int(11) NULL,
`access_subtype_document_id` int(11) NULL,
`access_level` int(4) default 0,
PRIMARY KEY (`id`),
INDEX `ind1` (`access_for`,`access_for_id`),
INDEX `ind2` (`access_type`,`access_type_id`),
INDEX `ind3` (`access_type`,`access_subtype_grid_id`,`access_subtype_column_id`),
INDEX `ind4` (`access_type`,`access_subtype_document_id`,`access_subtype_column_id`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
CREATE TABLE `role_userlist` (
`id` int(11) NOT NULL auto_increment,
`userid` int(11) NOT NULL,
`role_id` int(11) NOT NULL,
`userid_assigning_role` int(11) NOT NULL,
PRIMARY KEY (`id`),
INDEX (`role_id`),
INDEX (`userid`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;
CREATE TABLE `#__jgrid_user_type_defaults` (
`id` int(11) NOT NULL auto_increment,
`usertype_name` varchar(25) NOT NULL,
`access_level` int(11),
PRIMARY KEY (`id`),
INDEX `ind1` (`usertype_name`)
) ENGINE=MyISAM AUTO_INCREMENT=0 DEFAULT CHARSET=utf8;