explain SELECT a, b, COUNT(*) FROM tbname
GROUP BY a, b
order by a DESC
limit 1
a 和 b 列已經設置聯合索引, 為什么這種操作也會執行全表掃描呢?explain SELECT a, b FROM tbname
GROUP BY a, b
order by a DESC
去掉 COUNT 和 limit 則走索引沒有掃描, 這是為什么呢?
這種場景有什么優化思路呢?
表結構CREATE TABLE `tbname` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`a` INT(11) NULL DEFAULT '0',
`b` INT(11) NULL DEFAULT '0',
PRIMARY KEY (`id`),
INDEX `testkey` (`a`, `b`)
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB;
INSERT INTO `tbname` (`a`, `b`) VALUES ('1', '1');
INSERT INTO `tbname` (`a`, `b`) VALUES ('1', '1');
INSERT INTO `tbname` (`a`, `b`) VALUES ('1', '1');
INSERT INTO `tbname` (`a`, `b`) VALUES ('1', '1');
INSERT INTO `tbname` (`a`, `b`) VALUES ('1', '1');
查詢1:explain SELECT a, b, COUNT(*) FROM tbname
GROUP BY a, b
order by a DESC
limit 1
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| ---: | --- | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | --- |
| 1 | SIMPLE | tbname | \N | index | testkey | testkey | 10 | \N | 5 | 100.00 | Using index; Using temporary; Using filesort |
查詢2:explain SELECT a, b FROM tbname
GROUP BY a, b
order by a DESC
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
| ---: | --- | --- | --- | --- | --- | --- | --- | --- | ---: | ---: | --- |
| 1 | SIMPLE | tbname | \N | range | testkey | testkey | 10 | \N | 1 | 100.00 | Using index for group-by; Using temporary; Using filesort |