3

次のように定義されたビューがあります。

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;
4

2 に答える 2