2013-04-08 5 views
0

Я использую этот запрос, чтобы получить рекордную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 ; 

И Объяснить результат запроса: enter image description here

Спасибо за любую помощь.

+3

Во-первых, очевидный вопрос: правильно ли указаны ваши таблицы? – Barranka

+1

После @Barranka: вы используете InnoDB и внешние ключи? – barbashov

+0

@Barranka и barbashov Спасибо, я обновил свой вопрос с подробностями индексов, и я использую MyISAM. – user969068

ответ

1

Вы должны добавить индексы на следующие столбцы:

  • live_data.contentid
  • content_asset.contentid
  • content_gener.contentid

И конвертировать большие таблицы в InnoDB с использованием ALTER TABLE table_name ENGINE = InnoDB.

Также часто рекомендуется использовать foreign keys.

+0

Спасибо, я проверю InnoDB :) – user969068

1

Если вы запустите explain [your full query] в консоли MySQL, вы увидите, какие индексы используются. В зависимости от размера каждой таблицы в соединении вы хотите иметь индексы в столбцах, используемых для подключения таблиц в соединении.

+0

Спасибо, я обновил свой вопрос с объяснением. – user969068