问题记录
在写SQL语句时,因为要多加上一个查询条件,导致我的sql变成了慢sql。 在这里简单记录一下。
为了方便表示,这里我简单用经典学生表信息作为设置
CREATE TABLE `Students` (
`id` INT(16) PRIMARY KEY AUTO_INCREMENT,
`name` VARCHAR(255) NOT NULL,
`age` INT(16) NOT NULL,
`sex` VARCHAR(2) NOT NULL,
`birthday` DATE DEFAULT NULL,
`class` VARCHAR(5) DEFAULT NULL
) ENGINE = INNODB CHARSET = utf8;
原始sql语句
select class,`name` from students where age > 19 group by class,name
显然这是,要查询年龄大于19岁的班级和学生信息,并且基于班级和名字先后去重。 在此,我创建了联合索引:
ALTER TABLE student`book`s ADD INDEX idx_class_name_age(class,`name`,age) COMMENT 'idx_class_name_age';
随后我们执行前面的sql语句,查看执行计划,是走了索引的。但是当sql语句变成
select class,`name` from students where class = 'A' and age > 19 group by class,name
同样是联合索引的最左字段,数据量大时,这条sql就会慢,因为查询顺序是where ,然后是group by。
在应用中,我的数据大概是1000+条,仅使用两个联合索引大概查询速度在2s,我加上了where两个条件字段的联合索引,让MySQL自己去做优化,大概提高到了100ms的数量级。猜测是在大数据的情况,group by会记临时表,这里涉及到松索引查询和紧索引查询,算一个优化点吧,但是多一个索引的是空间上的代价,或许还有更好的解决方案。但我自己在调试时,发现如果删除旧的索引idx_class_name_age创建新的idx_class_age,虽然提升了一点速度,但是还是不快,所以我就保留了两个索引。这一个就是MySQL的查询优化吧。
知识记录
官网上有记录关于松紧两种索引的说明,下面这个是有翻译的版本 MySQL group by是如何使用索引的?