1

このクエリを使用してレコードを取得しています

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 ;

そしてクエリ結果の説明: ここに画像の説明を入力

助けてくれてありがとう。

4

2 に答える 2

1

MySQL コンソールで実行するexplain [your full query]と、使用されているインデックスが表示されます。結合内の各テーブルのサイズに応じて、結合内のテーブルを接続するために使用される列にインデックスが必要です。

于 2013-04-08T23:08:37.350 に答える