3

これ以上最適化することは不可能と思われるクエリがあります (実行時間に関して)。これは単純な単純なクエリであり、インデックスが配置されており、InnoDB 設定を構成しようとしましたが、実際には何も役に立たないようです。

テーブル

クエリは、trk、auf、および paf の 3 つのテーブル間の JOIN です。

  • trk : トラックを表す ID を保持する一時テーブル。
  • auf : トラックに関連付けられたオーディオ ファイルを表すテーブル。
  • paf : パブリッシュされたオーディオ ファイルの ID を保持するテーブル。「フィルター」として機能します。
// 'trk' table  
CREATE TEMPORARY TABLE auf_713340 (  
  `id` char(36),   
  PRIMARY KEY (id)  
) ENGINE=MEMORY);  

// 'auf' table  
CREATE TABLE `file` (  
 `id` char(36) NOT NULL,  
 `track_id` char(36) NOT NULL,  
 `type` varchar(3) DEFAULT NULL,  
 `quality` int(1) DEFAULT '0',  
 `size` int(20) DEFAULT '0',  
 `duration` float DEFAULT '0',  
 `bitrate` int(6) DEFAULT '0',  
 `samplerate` int(5) DEFAULT '0',  
 `tagwritten` datetime DEFAULT NULL,  
 `tagwriteattempts` int(3) NOT NULL DEFAULT '0',  
 `audiodataread` datetime DEFAULT NULL,  
 `audiodatareadattempts` int(3) NOT NULL DEFAULT '0',  
 `converted` datetime DEFAULT NULL,  
 `convertattempts` int(3) NOT NULL DEFAULT '0',  
 `waveformgenerated` datetime DEFAULT NULL,  
 `waveformgenerationattempts` int(3) NOT NULL DEFAULT '0',  
 `flag` int(1) NOT NULL DEFAULT '0',  
 `status` int(1) NOT NULL DEFAULT '0',  
 `updated` datetime NOT NULL DEFAULT '2000-01-01 00:00:00',  
 PRIMARY KEY (`id`),  
 KEY `FK_file_track` (`track_id`),  
 KEY `file_size` (`size`),  
 KEY `file_type` (`type`),  
 KEY `file_quality` (`quality`),  
 CONSTRAINT `file_ibfk_1` FOREIGN KEY (`track_id`) REFERENCES `track` (`id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8

// 'paf' table  
CREATE TABLE `publishedfile` (  
  `file_id` varchar(36) NOT NULL,  
  `data` varchar(255) DEFAULT NULL,  
  `file_updated` datetime NOT NULL,  
  PRIMARY KEY (`file_id`)  
) ENGINE=InnoDB DEFAULT CHARSET=utf8  

クエリは通常、trk テーブル内の 50 ~ 100 の ID で実行するのに 1500 ミリ秒 ~ 2500 ミリ秒かかります。 auf テーブルは約 110 万行を保持し、paf テーブルは約 900.000 行を保持します。

MySQL サーバーは、4GB の Rackspace Cloud Server インスタンスで実行されます。

クエリ

SELECT auf.*
FROM auf_713340 trk
INNER JOIN file auf
  ON auf.track_id = trk.id
INNER JOIN publishedfile paf
  ON auf.id = paf.file_id

EXPLAIN を使用したクエリ

id select_type table type   possible_keys         key           key_len ref                                 rows Extra
1  SIMPLE      trk   ALL    NULL                  NULL NULL     NULL                                        60  
1  SIMPLE      auf   ref    PRIMARY,FK_file_track FK_file_track 108     func                                1   Using where
1  SIMPLE      paf   eq_ref PRIMARY               PRIMARY       110     trackerdatabase_development.auf.id  1   Using where; Using index

InnoDB 構成

[mysqld]

# The size of memory used to cache table data and indexes. The larger 
# this value is, the less I/O is needed to access data in tables. 
# Default value is 8MB. Recommendations point towards 70% - 80% of 
# available system memory.
innodb_buffer_pool_size=2850M

# Recommendations point towards using O_DIRECT to avoid double buffering.
# innodb_flush_method=O_DIRECT

# Recommendations point towards using 256M.
# @see http://www.mysqlperformanceblog.com/2006/07/03/choosing-proper-innodb_log_file_size/
innodb_log_file_size=256M

# The size in bytes of the buffer that InnoDB uses to write to the log files
# on disk. Recommendations point towards using 4MB.
innodb_log_buffer_size=4M

# The size of the buffer used for MyISAM index blocks.
key_buffer_size=128M

さて、問題は次のとおりです。クエリのパフォーマンスを向上させるにはどうすればよいですか? 結局のところ、問題のテーブルはそれほど大きくなく、インデックスが配置されています..?

4

2 に答える 2

0

aufテーブルでidフィールドをint(11)として作成し、自動インクリメントします。11を超えるすべてのintフィールドの長さは、11に編集します。

ありがとうリパサハ

于 2012-12-20T10:12:04.680 に答える
0

これを試して:

SELECT auf.* 
FROM file auf 
WHERE EXISTS 
      ( SELECT *
        FROM auf_713340 trk 
        WHERE auf.track_id = trk.id 
      )
  AND EXISTS
      ( SELECT *
        FROM publishedfile paf
        WHERE auf.id = paf.file_id
      ) ;

また、InnoDB エンジンで定義された一時テーブルまたは (プライマリ) インデックスをインデックスとして使用して効率をテストし、比較しBTREEます。HASH記憶が正しければ、メモリ テーブルにはデフォルトでインデックスがありますが、Btree ではありません。

于 2012-12-20T13:15:36.010 に答える