【问题标题】:How query with data functions in group by ca be optimized如何优化 group by 中的数据函数查询
【发布时间】:2012-11-26 08:49:14
【问题描述】:

我有一个如下所示的查询

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

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

【问题讨论】:

    标签: mysql select group-by query-optimization


    【解决方案1】:

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

    【讨论】:

    • 我已经有索引了............index(a,b) 表示 index(a) 和 index(a,b) 对吗?如果没有请告诉我
    【解决方案2】:

    student_fee_colle

    fee_type列上创建Index

    并运行以下查询

    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 )
    

    【讨论】:

      猜你喜欢
      • 2011-08-29
      • 2012-12-31
      • 2011-06-25
      • 2011-05-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      相关资源
      最近更新 更多