3

我有一个查询如下

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

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

4

2 回答 2

0

在student_fee_collections中的fee_type列上创建索引并重新检查Explain Query的输出。并在您的问题中更新相同的内容。

于 2012-12-08T09:02:34.530 回答
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 )
于 2013-09-02T12:44:22.517 回答