CREATE TABLE `t` (
`id` int(11) NOT NULL,
`city` varchar(16) NOT NULL,
`name` varchar(16) NOT NULL,
`age` int(11) NOT NULL,
`addr` varchar(128) DEFAULT NULL,
PRIMARY KEY (`id`),
KEY `city` (`city`)
) ENGINE=InnoDB;
这样的数据库表结构,查询城市是“杭州”的所有人名字,并且按照姓名排序返回前 1000 个人的姓名、年龄 的语句是 select city,name,age from t where city='杭州' order by name limit 1000 ;
后面讲到数据库会执行全字段排序或者rowid 排序来返回结果。
并且文章还讲了一个优化,使用联合索引来优化查询: alter table t add index city_user(city, name);,这样索引中 name 本身就是排序好的,数据库不需要再次执行排序工作,这对查询的性能来讲,可以增加不少。最后还讲到了覆盖索引继续优化一下这个场景: alter table t add index city_user_age(city, name, age);,这样数据库查询出来的结果包含所有的字段,也就是结果集就是我们要的最终结果,不需要往主键索引表中查询了。
我是个后端新手,比较好奇这种优化,小公司用到过吗?我不清楚这是后端的基本能力还是 DBA 专业数据库工作者才需要掌握的优化技能。