你们用过数据库联合索引优化排序功能吗

查看 65|回复 7
作者:ethusdt   
后端小白在学习数据库,看到一篇文章介绍 order by 的工作原理,有一个例子很有趣:
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 专业数据库工作者才需要掌握的优化技能。

联合索引, 排序优化, 覆盖索引

luoyou1014   
最基本的技能,没有比这更基本的了
ethusdt
OP
  
@luoyou1014 哈哈哈哈 好吧,我太小白了。数据库开始设计的时候,就要把常用的查询条件列出来,然后建立联合索引/复合索引吗?
ponder09   
@ethusdt 设计时很难考虑全的,当系统出现慢 sql 之后,再去针对 sql 加索引吧。
pangdundun996   
属于合格后端的基本功,但实际上好些工作几年的后端都不会
fengpan567   
了解一下 mysql 查询回表
encro   
数据库基本功:
1,知道如何开启 slow log,
2.知道 explain 以及查看慢查询,
3,知道组合索引适用场景。
iyaozhen   
算是基本功
而且大厂 DBA 也不管你这玩意儿。没那么多闲心给你业务优化 sql ( vip 业务另说,更多是想分一杯羹吧

)。DBA 我感觉更多是 DB SRE 工作,比如怎么发现你这个慢 sql
您需要登录后才可以回帖 登录 | 立即注册

返回顶部