次のように定義されたビューがあります。
CREATE VIEW vw_data_summary AS
SELECT
a.b_id AS b_id
b.txt_field AS b_txt_field
a.txt_field AS a_txt_field
SUM(a.amount) AS amount
FROM
a JOIN b
WHERE
a.b_id = b.id
GROUP BY
a.b_id, b.txt_field, a.txt_field
テーブルa
には 650,000 レコードがあり、テーブルb
には 3,200 レコードがあります。に索引がありますa.b_id
。テーブルは、テーブル a で 1 日あたり 1,500 レコード、テーブル b で 1 日あたり 50 レコードの割合で増加します。
ビューで選択を実行すると、約 25 秒かかります。テーブルのサイズが大きくなるにつれて、このクエリのパフォーマンスが急速に低下するのではないかと懸念しています。
パフォーマンスを改善するために、個々のテーブルまたはビュー自体に対して何ができますか?
説明
上記の選択で実行explain
すると、次の出力が得られます。
id select_type table type possible_keys key key_len ref rows Extra
1 SIMPLE b ALL PRIMARY NULL NULL NULL 3078 Using temporary; Using filesort
1 SIMPLE a ref b_id b_id 4 b.id 134
テーブル定義
CREATE TABLE IF NOT EXISTS `b` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`txt_field` varchar(50) NOT NULL,
PRIMARY KEY (`id`),
KEY `txt_field` (`txt_field`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
CREATE TABLE IF NOT EXISTS `a` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`b_id` int(11) NOT NULL,
`txt_field` varchar(255) NOT NULL,
`amount` decimal(10,2) NOT NULL,
PRIMARY KEY (`id`),
KEY `txt_field` (`txt_field`),
KEY `b_id` (`b_id`),
KEY `new_index` (`txt_field`,`b_id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;