Я использую этот запрос, чтобы получить рекорднуюMysql запрос со многими присоединиться занимает много времени для загрузки
SELECT *
FROM (`content` as c)
LEFT JOIN `content_assets` AS ca ON `ca`.`contentid` = `c`.`id`
LEFT JOIN `assets` AS a ON `a`.`act_id` = `ca`.`actorid`
INNER JOIN `content_gens` AS cg ON `cg`.`contentid` = `c`.`id`
INNER JOIN `gens` AS g ON `cg`.`genid` = `g`.`gen_id`
LEFT JOIN `live_data` AS l ON `l`.`contentid` = `c`.`id`
LEFT JOIN `live_type` AS lt ON `lt`.`lt_id` = `l`.`live_type`
LEFT JOIN `returned` AS r ON `r`.`content_id` = `c`.`id`
WHERE `c`.`id` = '14175'
моего live_data стол главная проблема здесь, которая является причиной этого времени загрузки, она содержит около 200k записей и его принятия 20-40 секунд для загрузки страницы. Если я не присоединяюсь к этой таблице, все в порядке. В настоящее время я использую кэширование на основе файлов для кэширования результата из вышеприведенного запроса, но я хотел бы знать, может ли быть оптимизирован выше запрос.
Редактировать: Здесь показаны мои табличные индексы.
-- phpMyAdmin SQL Dump
-- version 3.4.5
-- http://www.phpmyadmin.net
--
-- Host: localhost
-- Generation Time: Apr 08, 2013 at 11:07 PM
-- Server version: 5.5.16
-- PHP Version: 5.3.8
SET SQL_MODE="NO_AUTO_VALUE_ON_ZERO";
SET time_zone = "+00:00";
--
-- Database: `database`
--
-- --------------------------------------------------------
--
-- Table structure for table `assets`
--
CREATE TABLE IF NOT EXISTS `assets` (
`act_id` int(11) NOT NULL AUTO_INCREMENT,
......
PRIMARY KEY (`act_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=8726 ;
-- --------------------------------------------------------
--
-- Table structure for table `content`
--
CREATE TABLE IF NOT EXISTS `content` (
`id` int(11) NOT NULL AUTO_INCREMENT,
.........
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=14267 ;
-- --------------------------------------------------------
--
-- Table structure for table `content_asset`
--
CREATE TABLE IF NOT EXISTS `content_asset` (
`contentid` int(11) NOT NULL,
`actorid` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `content_gener`
--
CREATE TABLE IF NOT EXISTS `content_gener` (
`contentid` int(11) NOT NULL,
`genid` int(11) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- --------------------------------------------------------
--
-- Table structure for table `gens`
--
CREATE TABLE IF NOT EXISTS `gens` (
`gen_id` int(11) NOT NULL AUTO_INCREMENT,
......
PRIMARY KEY (`gen_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=65 ;
-- --------------------------------------------------------
--
-- Table structure for table `live_data`
--
CREATE TABLE IF NOT EXISTS `live_data` (
`link_id` int(11) NOT NULL AUTO_INCREMENT,
.....
PRIMARY KEY (`link_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=214014 ;
-- --------------------------------------------------------
--
-- Table structure for table `live_type`
--
CREATE TABLE IF NOT EXISTS `live_type` (
`lt_id` int(11) NOT NULL AUTO_INCREMENT,
....
PRIMARY KEY (`lt_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=4 ;
-- --------------------------------------------------------
--
-- Table structure for table `returned`
--
CREATE TABLE IF NOT EXISTS `returned` (
`r_id` int(11) NOT NULL AUTO_INCREMENT,
....
PRIMARY KEY (`r_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
И Объяснить результат запроса:
Спасибо за любую помощь.
Во-первых, очевидный вопрос: правильно ли указаны ваши таблицы? – Barranka
После @Barranka: вы используете InnoDB и внешние ключи? – barbashov
@Barranka и barbashov Спасибо, я обновил свой вопрос с подробностями индексов, и я использую MyISAM. – user969068