Помогите оптимизировать запрос

Тема в разделе "SQL", создана пользователем DeMx, 2 май 2007.

Статус темы:
Закрыта.
  1. DeMx

    DeMx Гость

    Запрос:
    Код (Text):
    SELECT
    CONCAT(
    '/photos/',
    pgc.pg_cat_name,
    '/'
    ) AS pg_cat_path,
    pgc.pg_cat_title,
    CONCAT(
    '/photos/',
    pgc.pg_cat_name,
    '/',
    pg.gallery_name,
    '/'
    ) AS gallery_path,
    pg.gallery_title,
    pg.gallery_desc,
    p.report_id,
    p.report_num,
    p.file_type,
    p.report_preview,
    UNIX_TIMESTAMP(pg.date_add) AS date_add,
    DATE_FORMAT(pg.time_add, '%H:%i') AS time_add
    FROM
    reports_galleries AS pg
    LEFT JOIN reports_galleries_cats AS pgc ON (pg.pg_cat_id = pgc.pg_cat_id)
    LEFT JOIN reports_types AS pt ON (pgc.pg_cat_type = pt.type_id)
    LEFT JOIN reports AS p ON (
    p.report_status = 1 AND
    p.report_id IN (SELECT MAX(p2.report_id) FROM reports AS p2 WHERE p2.gallery_id = pg.gallery_id)
    )
    WHERE
    pg.gallery_status = 1 AND
    pg.gallery_access = 0 AND
    pgc.pg_cat_type = '1'
    GROUP BY
    pg.gallery_id
    ORDER BY
    pg.gallery_id DESC,
    p.report_id DESC
    Таблицы:
    Код (Text):
    CREATE TABLE `reports` (
    `report_id` int(11) NOT NULL auto_increment,
    `report_num` int(11) NOT NULL default '0',
    `report_status` tinyint(1) NOT NULL default '0',
    `gallery_id` int(11) NOT NULL default '0',
    `file_type` varchar(5) NOT NULL default '',
    `report_preview` varchar(255) NOT NULL default '',
    `report_views` bigint(20) NOT NULL default '0',
    `rating` int(11) NOT NULL default '0',
    `rating_voters` int(11) NOT NULL default '0',
    `rating_vip` int(11) NOT NULL default '0',
    `rating_voters_vip` int(11) NOT NULL default '0',
    `comments_lock` tinyint(1) NOT NULL default '0',
    `date_add` date NOT NULL default '0000-00-00',
    `time_add` time NOT NULL default '00:00:00',
    PRIMARY KEY (`report_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;


    CREATE TABLE `reports_galleries` (
    `gallery_id` int(11) NOT NULL auto_increment,
    `type_id` int(11) NOT NULL default '0',
    `pg_cat_id` int(11) NOT NULL default '0',
    `place_id` int(11) NOT NULL default '0',
    `user_id` int(11) NOT NULL default '0',
    `photographer_id` int(11) NOT NULL default '0',
    `photographer_name` varchar(100) NOT NULL default '',
    `gallery_access` tinyint(1) NOT NULL default '0',
    `gallery_pass` varchar(50) NOT NULL default '',
    `gallery_status` tinyint(1) NOT NULL default '0',
    `gallery_subscribe` tinyint(1) NOT NULL default '0',
    `gallery_name` varchar(100) NOT NULL default '',
    `gallery_title` varchar(100) NOT NULL default '',
    `gallery_desc` text NOT NULL,
    `email_lock` tinyint(1) NOT NULL default '0',
    `comments_lock` tinyint(1) NOT NULL default '0',
    `rating` int(11) NOT NULL default '0',
    `rating_voters` int(11) NOT NULL default '0',
    `date_add` date NOT NULL default '0000-00-00',
    `time_add` time NOT NULL default '00:00:00',
    PRIMARY KEY (`gallery_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

    CREATE TABLE `reports_galleries_cats` (
    `pg_cat_id` int(11) NOT NULL auto_increment,
    `pg_cat_type` tinyint(1) NOT NULL default '0',
    `pg_cat_faces` tinyint(1) NOT NULL default '0',
    `pg_cat_name` varchar(100) NOT NULL default '',
    `pg_cat_title` varchar(100) NOT NULL default '',
    PRIMARY KEY (`pg_cat_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;

    CREATE TABLE `reports_types` (
    `type_id` int(11) NOT NULL auto_increment,
    `type_name` varchar(100) NOT NULL default '',
    `type_title` varchar(100) NOT NULL default '',
    `type_title_m` varchar(50) NOT NULL default '',
    `file_title` varchar(100) NOT NULL default '',
    `file_title_2` varchar(50) NOT NULL default '',
    PRIMARY KEY (`type_id`)
    ) ENGINE=MyISAM DEFAULT CHARSET=cp1251;
    Сейчас при выполнении этого запроса сервер возвращает "You probably tried to upload too large file."

    Структуру менять нельзя... и хотелось бы сделать все в одном запросе.

    А нужно мне вытащить запись из reports_galleries (галереи), вместе с последней записью из reports (файлы галереи). Файлы галереи бывают нескольких типов (в данном случае это 'photos'). Типы файлов хранятся в reports_types.
     
  2. Barmutik

    Barmutik Гость

    Как первое что приходит смотря на запрос .. попытаться избавиться от конструкции IN (SELECT..., так как оно выполянесят для каждой записи и соответственно ест много времени.. вместо неё лучше создайте и джойнитесь с подзапросом... будет явно быстрее .. на больших объёмах .. на малых не знаю...

    Во вторых построить индекс по полю report_status у таблицы Reports...
     
Загрузка...
Статус темы:
Закрыта.

Поделиться этой страницей