后端小白在学习数据库,看到一篇文章介绍 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 专业数据库工作者才需要掌握的优化技能。
![]() |
1
luoyou1014 2 天前 ![]() 最基本的技能,没有比这更基本的了
|
![]() |
2
ethusdt OP @luoyou1014 哈哈哈哈 好吧,我太小白了。数据库开始设计的时候,就要把常用的查询条件列出来,然后建立联合索引/复合索引吗?
|
![]() |
4
pangdundun996 2 天前
属于合格后端的基本功,但实际上好些工作几年的后端都不会
|
5
fengpan567 2 天前
了解一下 mysql 查询回表
|
![]() |
6
encro 2 天前 ![]() 数据库基本功:
1,知道如何开启 slow log, 2.知道 explain 以及查看慢查询, 3,知道组合索引适用场景。 |
![]() |
7
iyaozhen 2 天前
|
![]() |
8
Mandelo 2 天前
基本能力: 问 AI
|
![]() |
10
Ketteiron 2 天前
B+树、最左匹配,几乎是面试必考题。
|
![]() |
11
newaccount 2 天前
销售开始在群里大喊网站卡了
你打开数据库监控发现 cpu 涨到 80% 一看全特么是秒级的查询 整个人头都大了,这又是哪位神仙新上了啥功能啊 赶紧看看语句用索引覆盖顶一下,先缓过来这波再去优化查询 |
12
deplives 2 天前
不是,这个都算是数据库最基础的了吧?
|
![]() |
13
bronyakaka 1 天前
数据量太多加什么索引都没用
|
![]() |
14
itechify PRO 简单查询,一开始没做索引的话,几十万数据量加不加无所谓,现在机器能扛着,过百万了再考虑
|