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

3 天前
 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 专业数据库工作者才需要掌握的优化技能。

1236 次点击
所在节点    数据库
14 条回复
luoyou1014
3 天前
最基本的技能,没有比这更基本的了
ethusdt
3 天前
@luoyou1014 哈哈哈哈 好吧,我太小白了。数据库开始设计的时候,就要把常用的查询条件列出来,然后建立联合索引/复合索引吗?
ponder09
3 天前
@ethusdt 设计时很难考虑全的,当系统出现慢 sql 之后,再去针对 sql 加索引吧。
pangdundun996
3 天前
属于合格后端的基本功,但实际上好些工作几年的后端都不会
fengpan567
3 天前
了解一下 mysql 查询回表
encro
3 天前
数据库基本功:

1,知道如何开启 slow log,
2.知道 explain 以及查看慢查询,
3,知道组合索引适用场景。
iyaozhen
3 天前
算是基本功

而且大厂 DBA 也不管你这玩意儿。没那么多闲心给你业务优化 sql ( vip 业务另说,更多是想分一杯羹吧 )。DBA 我感觉更多是 DB SRE 工作,比如怎么发现你这个慢 sql
Mandelo
3 天前
基本能力: 问 AI
ethusdt
3 天前
@Mandelo 掌握了这些才能问 AI 呀,要不然都是空白,根本不会去考虑这一个优化点。
Ketteiron
3 天前
B+树、最左匹配,几乎是面试必考题。
newaccount
3 天前
销售开始在群里大喊网站卡了
你打开数据库监控发现 cpu 涨到 80%
一看全特么是秒级的查询
整个人头都大了,这又是哪位神仙新上了啥功能啊
赶紧看看语句用索引覆盖顶一下,先缓过来这波再去优化查询
deplives
3 天前
不是,这个都算是数据库最基础的了吧?
bronyakaka
3 天前
数据量太多加什么索引都没用
itechify
3 天前
简单查询,一开始没做索引的话,几十万数据量加不加无所谓,现在机器能扛着,过百万了再考虑

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1166472

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX