group by mysql 性能吃_优化(MySQL)SELECT .. GROUP BY性能

面对一个包含A、B、C和D四列的InnoDB表,为找到特定A值下使C列唯一的所有B值,使用了带有GROUP BY和HAVING的SQL存储过程。然而,发现GROUP BY操作显著降低了查询性能,尽管B列已建立索引。讨论了如何改进查询或优化表结构以提升性能。

我有一个相当静态的(InnoDB)表T有四列:A,B,C和D。

我首先希望确定A的给定值,B的哪些值在所有记录中产生唯一的C。我的尝试如下:

CREATE PROCEDURE P(x int) BEGIN

SELECT B

FROM T

WHERE A = x

GROUP BY B

HAVING COUNT(DISTINCT C) = COUNT(C);

END但引入GROUP BY会大大降低此查询的性能,尽管列B上有一个索引。有没有更有效的方法,或者我可以以某种方式提高此查询的性能?

为了回应Daan的评论,该表格创建如下:

CREATE TABLE T (

A int(11) NOT NULL,

B varchar(45) NOT NULL,

C varchar(255) DEFAULT NULL,

D int(11) NOT NULL,

PRIMARY KEY (A,B,D),

KEY iA (A),

KEY iB (B),

KEY iC (C)

) ENGINE=InnoDB DEFAULT CHARSET=latin1

针对下面的tombom的评论,该查询解释如下:

+----+-------------+-------+------+---------------+---------+---------+-------+---------+-----------------------------+

| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |

+----+-------------+-------+------+---------------+---------+---------+-------+---------+-----------------------------+

| 1 | SIMPLE | T | ref | PRIMARY,iA | PRIMARY | 4 | const | 2603472 | Using where; Using filesort |

+----+-------------+-------+------+---------------+---------+---------+-------+---------+-----------------------------+

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值