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 に答える