За последние 24 часа нас посетили 136913 программистов и 2278 роботов. Сейчас ищут 1884 программиста ...

денормализация. или как-то еще

Тема в разделе "MySQL", создана пользователем armadillo, 20 июл 2010.

  1. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    [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. 1   SIMPLE      ug      ref     usrid,grpid     usrid   5   const   19      Using where; Using index; Using temporary; Using f...
    2. 1   SIMPLE  rl  ref     objtype     objtype     7   const,ug.grpid  154     Using where; Using index
    3. 1   SIMPLE  dc  eq_ref  PRIMARY     PRIMARY     4   rl.docid    1   Using where
    4. 1   SIMPLE  dcm     ref     documid,actual  documid     9   const,dc.documid    1   Using where
    5. 1   SIMPLE  ra  eq_ref  PRIMARY     PRIMARY     42  dcm.typeid,rl.roleid,const,...  1   Using where
     
  2. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    вот и ответ, остальное нормально :)
     
  3. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    да я как бэ в курсе. хотя на самом это не единственная проблема. там переборы все равно будут огромными.
    и какие идеи?
     
  4. phpdude

    phpdude Активный пользователь

    С нами с:
    9 июл 2010
    Сообщения:
    697
    Симпатии:
    0
    тут советом наверное не поможешь, тут надо брать базу и крутить ее :)

    "пробовать" так сказать :)
     
  5. artoodetoo

    artoodetoo Суперстар
    Команда форума Модератор

    С нами с:
    11 июн 2010
    Сообщения:
    11.132
    Симпатии:
    1.251
    Адрес:
    там-сям
    жжоте! понятно только, что это EDMS. можно поинтересоваться структурой таблиц, которые сюда вошли?
     
  6. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    [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 - текущая актуальная версия (если есть)

    что-то майадмин индексы не вывел в экспорт



    зы запрос вверху поправил а то уже с утра голова отключается
     
  7. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Я бы создал индексы по всем используемым в запросе полям
     
  8. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    давно.
     
  9. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Судя по приведенному explain используются только 7 индексов, а у вас в запросе используется намного больше полей.
     
  10. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    индексы бывают составные. как ты собрался использовать раздельные индексы по полям в одном условии?
     
  11. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Вообще-то индексы использует Mysql. Вот к примеру часть вашего запроса ra.level>1. У вас нет индекса и Mysql вынужден перебирать всю таблицу. А с индексом на поле level он сделает работу гораздо быстрее. Также Mysql будет сканировать все остальные таблицы по полям, по которым у вас нет индексов
     
  12. armadillo

    armadillo Активный пользователь

    С нами с:
    6 апр 2007
    Сообщения:
    2.380
    Симпатии:
    0
    Адрес:
    Russia, Moscow
    ладно, в общем очевидностей уже хватило.

    то что во where формируется динамически и мне заранее не известно.
    там (в ra) есть составной индекс на все поля, используемые в запросе, в частности поэтому дважды добавляется dcm.typeid
    он используется и проблема не в этом.

    в общих целях выясни зачем нужны составные индексы)
     
  13. runner

    runner Активный пользователь

    С нами с:
    16 апр 2010
    Сообщения:
    343
    Симпатии:
    1
    Адрес:
    Ташкент
    Далее не мое

    Вообще погугли:
    Mysql составной индекс
    Удачи