問題
次のクエリは、次の場合を除いて、実行に30秒以上かかります。
- 並べ替えを削除します(クエリしてから1秒未満)
- 個別のキーワードを削除します:(クエリしてから1秒未満)
- 結合の削除を開始します(クエリしてから5秒未満)
質問
このクエリを1秒以内に実行するにはどうすればよいですか。必須:ある種の種類を含む、以下の参加で説明されているように、関連データを含む会議の一意のリストを取得するにはどうすればよいですか。
関連データは、関連フィールドがあるかどうかの判断とGROUP_CONCAT操作の実行の両方に使用されます。したがって、同じbookeditemsテーブルに3つの異なる結合が必要です。
ヘルプや提案を事前に感謝します!私はこれに数時間頭をぶつけてきました!
クエリ
SELECT
DISTINCT( `meetings`.`id` ) AS `meeting_id`,
`meetings`.`uid` AS meeting_uid,
`meetings_SERV`.`id` AS meetings_SERV_id,
`meetings_TRANSP`.`id` AS meetings_TRANSP_id,
`meetings_ACCO`.`id` AS meetings_ACCO_id,
`meetings_BOOKEDITEMS`.`id` AS meetings_BOOKEDITEMS_id
FROM `meetings` AS meetings
LEFT OUTER JOIN `bookeditems` AS `meetings_SERV`
ON `meetings`.`uid` = `meetings_SERV`.`meeting_uid`
AND 'SER' = `meetings_SERV`.`item_type`
LEFT OUTER JOIN `bookeditems` AS `meetings_TRANSP`
ON `meetings`.`uid` = `meetings_TRANSP`.`meeting_uid`
AND 'TRA' = `meetings_TRANSP`.`item_type`
LEFT OUTER JOIN `bookeditems` AS `meetings_ACCO`
ON `meetings`.`uid` = `meetings_ACCO`.`meeting_uid`
AND 'ACC' = `meetings_ACCO`.`item_type`
LEFT OUTER JOIN `bookeditems` AS `meetings_BOOKEDITEMS`
ON `meetings`.`uid` = `meetings_BOOKEDITEMS`.`meeting_uid`
ORDER BY `meetings`.`datetime`
LIMIT 0, 50
テーブル定義
CREATE TABLE IF NOT EXISTS `bookeditems` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`meeting_uid` varchar(256) NOT NULL,
`item_type` varchar(256) NOT NULL,
PRIMARY KEY (`id`),
KEY `meeting_uid` (`meeting_uid`(255)),
KEY `index1` (`meeting_uid`(255),`item_type`(255))
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=5889 ;
CREATE TABLE IF NOT EXISTS `meetings` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`uid` varchar(256) NOT NULL,
`datetime` datetime DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `uid` (`uid`(255)),
KEY `datetime` (`datetime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=7487 ;
EXPLAINSELECTの結果
id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra
-------------------------------------------------------------------------------------------------------------------------------------
1 | SIMPLE | meetings | ALL | NULL | NULL | NULL | NULL | 7483 | Using temporary; Using filesort
1 | SIMPLE | meetings_SERV | ref | meeting_uid,index1 | meeting_uid | 767 | test.meetings.uid | 1 |
1 | SIMPLE | meetings_TRANSP | ref | meeting_uid,index1 | meeting_uid | 767 | test.meetings.uid | 1 |
1 | SIMPLE | meetings_ACCO | ref | meeting_uid,index1 | meeting_uid | 767 | test.meetings.uid | 1 |
1 | SIMPLE | meetings_BOOKEDITEMS | ref | meeting_uid,index1 | meeting_uid | 767 | test.meetings.uid | 1 |
プロファイリングの結果
starting 0.000092
checking permissions 0.000003
checking permissions 0.000002
checking permissions 0.000001
checking permissions 0.000001
checking permissions 0.000003
Opening tables 0.000036
System lock 0.000008
init 0.000033
optimizing 0.000005
statistics 0.000035
preparing 0.000019
Creating tmp table 0.000165
executing 0.000004
Copying to tmp table 1.790968
converting HEAP to MyISAM 1.669041
Copying to tmp table on disk 28.32606
Sorting result 0.141737
Sending data 0.000099
end 0.000005
removing tmp table 0.022097
end 0.000014
query end 0.000008
closing tables 0.000017
freeing items 0.000779
logging slow query 0.000004
cleaning up 0.000005
パートソリューション
以下のEricR.Rathのヘルプに基づいて、クエリのプロファイルを作成し、max_heap_table_size = 256M&tmp_table_size = 256MをMySQL構成に追加することで、「HEAPからMyISAMへの変換」および「ディスク上のtmpテーブルへのコピー」の実行手順を排除できました。 "。
これは合計実行時間が2秒未満になりますが、クエリの最適化に関して他に提案がある場合は、これがすべてできるとはまだ確信していません。お知らせください。
max_heap_table_size&tmp_table_sizeconfigに続くプロファイリング
...
executing 0.000004
Copying to tmp table 1.790968
Sorting result 0.141737
...