[sql]SELECT SQL_NO_CACHE count(distinct(dcm.docid)) FROM sed2_1a2.docum dcm JOIN sed2_1a2.document dc ON dcm.documid=dc.documid JOIN sed2_1a2.role_doc_user rl ON dcm.documid=rl.docid AND rl.objtype=23 JOIN sed2_1a2.allrole_access ra ON ra.roleid=rl.roleid AND ra.typeid=dcm.typeid AND ra.statid=dcm.statid AND ra.objtype=10 AND ra.objid=dcm.typeid JOIN test111a.r_us_gr ug ON ug.usrid='2321' AND rl.objid=ug.grpid WHERE dcm.actual=1 AND dcm.fldel=0 AND dc.fldel=0 AND (dc.date_crt>0) AND ra.level>1 [/sql] работает уже слишком медленно структура понятна? r_us_gr и allrole_access уже линеаризованы. explain: Код (Text): 1 SIMPLE ug ref usrid,grpid usrid 5 const 19 Using where; Using index; Using temporary; Using f... 1 SIMPLE rl ref objtype objtype 7 const,ug.grpid 154 Using where; Using index 1 SIMPLE dc eq_ref PRIMARY PRIMARY 4 rl.docid 1 Using where 1 SIMPLE dcm ref documid,actual documid 9 const,dc.documid 1 Using where 1 SIMPLE ra eq_ref PRIMARY PRIMARY 42 dcm.typeid,rl.roleid,const,... 1 Using where
да я как бэ в курсе. хотя на самом это не единственная проблема. там переборы все равно будут огромными. и какие идеи?
[sql]CREATE TABLE `allrole_access` ( `objtype` smallint(6) NOT NULL default '0', `objid` varchar(8) NOT NULL default '', `roleid` varchar(8) NOT NULL default '', `typeid` varchar(8) NOT NULL default '', `level` int(11) NOT NULL, `statid` varchar(8) NOT NULL default '', PRIMARY KEY (`typeid`,`roleid`,`objtype`,`objid`,`statid`) ) ENGINE=InnoDB DEFAULT CHARSET=cp1251; CREATE TABLE `role_doc_user` ( `objtype` smallint(6) NOT NULL, `objid` int(11) default NULL, `roleid` varchar(8) default NULL, `docid` int(11) NOT NULL, `rdu_maker_type` int(11) NOT NULL, `rdu_maker_id` int(11) NOT NULL, `idd` int(11) NOT NULL auto_increment, PRIMARY KEY (`idd`), KEY `objtype` (`objtype`,`objid`,`docid`,`roleid`) ) ENGINE=InnoDB DEFAULT CHARSET=cp1251; CREATE TABLE `r_us_gr` ( `grpid` int(11) default NULL, `usrid` int(11) default NULL, KEY `usrid` (`usrid`,`grpid`), KEY `grpid` (`grpid`) ) ENGINE=InnoDB DEFAULT CHARSET=cp1251; [/sql] document - документы, documid - id, fldel - флаг удаленного docum - версии, fldel, documid, docid - id версии, actual - текущая актуальная версия (если есть) что-то майадмин индексы не вывел в экспорт зы запрос вверху поправил а то уже с утра голова отключается
Судя по приведенному explain используются только 7 индексов, а у вас в запросе используется намного больше полей.
Вообще-то индексы использует Mysql. Вот к примеру часть вашего запроса ra.level>1. У вас нет индекса и Mysql вынужден перебирать всю таблицу. А с индексом на поле level он сделает работу гораздо быстрее. Также Mysql будет сканировать все остальные таблицы по полям, по которым у вас нет индексов
ладно, в общем очевидностей уже хватило. то что во where формируется динамически и мне заранее не известно. там (в ra) есть составной индекс на все поля, используемые в запросе, в частности поэтому дважды добавляется dcm.typeid он используется и проблема не в этом. в общих целях выясни зачем нужны составные индексы)