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

1万+

被折叠的 条评论
为什么被折叠?



