我有如下定义的视图:
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,500 条记录的速度增长,在表 b 上以每天 50 条记录的速度增长。
当我在视图上运行选择时,大约需要 25 秒。我担心随着表的大小继续增长,此查询的性能将迅速下降。
我可以对单个表或视图本身做些什么来提高性能?
解释
在上面的 select 上运行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;