如何优化分组中的数据功能查询

时间:2012-12-08 07:37:43

标签: mysql select group-by query-optimization

我有一个查询,如下所示

SELECT MONTHNAME( f.receipt_date ) AS MONTH , 
SUM( CASE WHEN fm.fee_name =  'University Fees' THEN f.fee_amount END ) AS A
FROM fee_type_masters fm
INNER JOIN student_fee_collections f ON fm.id = f.fee_type
GROUP BY MONTH( f.receipt_date )

我的表就像

CREATE TABLE `fee_type_masters` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `fee_name` varchar(255) DEFAULT NULL,
 `fee_type` varchar(255) DEFAULT NULL,
 `year` varchar(255) DEFAULT NULL,
 `student_type` int(11) DEFAULT NULL,
 `due_date` varchar(255) DEFAULT NULL,
 `amount` float DEFAULT NULL,
 `accounts_master_id` varchar(255) DEFAULT NULL,
 `comments` varchar(255) DEFAULT NULL,
 `status` varchar(255) DEFAULT NULL,
 `sem` varchar(255) DEFAULT NULL,
 `degree_id` int(11) DEFAULT NULL,
 `approve_needed` varchar(255) DEFAULT NULL,
 `concession_allowed` varchar(255) DEFAULT NULL,
 `created_at` datetime DEFAULT NULL,
 `updated_at` datetime DEFAULT NULL,
 `relation_id` int(11) DEFAULT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=latin1

CREATE TABLE `student_fee_collections` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `student_id` int(11) DEFAULT NULL,
 `fee_type` int(11) DEFAULT NULL,
 `fee_amount` int(11) DEFAULT '0',
 `due` int(11) DEFAULT '0',
 `received` int(11) DEFAULT '0',
 `concession` int(11) DEFAULT '0',
 `receipt_no` int(11) DEFAULT NULL,
 `receipt_date` date DEFAULT NULL,
 `received_by` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `amount` int(11) DEFAULT '0',
 `late_fee` int(11) DEFAULT '0',
 `pay_mode` varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL,
 `comments` text COLLATE utf8_unicode_ci,
 `created_at` datetime DEFAULT NULL,
 `updated_at` datetime DEFAULT NULL,
 PRIMARY KEY (`id`),
 KEY `student_id` (`fee_type`,`student_id`)
) ENGINE=InnoDB AUTO_INCREMENT=325 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

每个都有超过20000行

我的解释计划就像

id  select_type table   type    possible_keys   key key_len ref rows    Extra
1   SIMPLE  fm  ALL PRIMARY NULL    NULL    NULL    7000    Using temporary; Using filesort
1   SIMPLE  f   ref student_id  student_id  5   emsnew.fm.id    28000   Using where

任何人请告诉我如何优化查询或重写。

2 个答案:

答案 0 :(得分:0)

student_fee_collections 中的 fee_type 列上创建索引,然后重新检查解释查询的输出。并在您的问题中更新相同的内容。

答案 1 :(得分:0)

student_fee_colle

中的 fee_type 列上创建索引

并运行以下查询

SELECT MONTHNAME( f.receipt_date ) AS MONTH , 
SUM( CASE WHEN fm.fee_name =  'University Fees' THEN f.fee_amount END ) AS A
FROM fee_type_masters fm
INNER JOIN student_fee_collections f USE index(fee_type_IDX) ON fm.id = f.fee_type
GROUP BY MONTH( f.receipt_date )