下面两条 SQL 语句哪个效率更高?

2019-06-24 11:08:49 +08:00
 imherer

表结构如下: uid,rid,name,home,event,data,time

其中 uid 和 rid 联合唯一索引

假如现在表里有接近 100W 行数据,其中每个 uid 大概有 10 行记录

现要查询出单个 uid 下的最大 rid,下面哪个 SQL 语句效率更高呢?

1.SELECT MAX(rid) AS rid FROM table WHERE uid = $1

2.SELECT rid FROM table WHERE uid = $1 ORDER BY rid DESC LIMIT 1

数据库为:PostgreSQL

另外像这样的表结构没有主键性能上会有什么问题吗?(因为主键是用不到的)

8875 次点击
所在节点    PostgreSQL
34 条回复
carlclone
2019-06-24 14:32:02 +08:00
感觉是一样的 , uid 确认的情况下 rid 是有序的 , 并不需要再排序
polymerdg
2019-06-24 16:29:32 +08:00
MYSQL 第一种
MetoYou
2019-06-24 16:35:46 +08:00
有索引能命中应该是一样的,没索引应该是 1 快
Aruforce
2019-06-24 16:46:55 +08:00
UID,RID 联合索引应该是有顺序的...
大概类似于..这个结构
```
BPTree{
NODE uid; //uid 里面有一个 RID 的系列节点 array []形式?。。而这些节点是在插入时就排好序的...
}
```
这个两种实现速度上应该没什么区别才对...

1 的更容易看出意思来...
javlib
2019-06-24 19:36:46 +08:00
用 explain 看看呢? pg 的 explain 应该可以给出优化后的执行 plan
maierhuang
2019-06-24 23:30:08 +08:00
一个字段上有索引的情况下两种执行计划是一致的,如果是无索引(或则楼主这种联合索引 rid 在后的情况下),max ( rid )走全表扫描,order by 这种需要 sort。
leishi1313
2019-06-25 00:29:19 +08:00
与其盲猜,不如用 EXPLAIN ANALYZE 在表上跑一下不就知道了嘛
applehater
2019-06-25 00:55:39 +08:00
怎么禁用缓存?
Iamnotfish
2019-06-25 04:30:46 +08:00
哈,这个楼主如果用的是 SQL 的话我刚测过。160W 条数据,用 MAX 的话是比 DESC LIMIT 1 要快的,大概快十几 MS,不过不确定是不是因为有缓存了才是这样的结果。
wd
2019-06-25 06:33:27 +08:00
where 部分过滤之后,后续的动作不就是那 10 条记录的操作了么,这有啥好比的。
gavinjou818
2019-06-25 10:07:12 +08:00
我感觉都差不多,假如要纠结...是不是 limit1 多了一个操作
ColoThor
2019-06-25 10:29:10 +08:00
max 不需要排序吧,性能应该更好?
zclHIT
2019-06-25 10:31:51 +08:00
mysql 是 1,但是你不是有数据库么。。直接在真实数据中执行一下就能看到了啊。。。
clarkyi
2019-06-25 10:44:37 +08:00
SQL1 执行 explain 得到的结果
QUERY PLAN
Aggregate (cost=2582.44..2582.45 rows=1 width=4)
-> Index Scan using idx_table_uid on table_name (cost=0.57..2580.40 rows=815 width=4)
Index Cond: ((uid)::text = '$id'::text)


SQL2 执行得到的结果
Limit (cost=2584.48..2584.48 rows=1 width=4)
-> Sort (cost=2584.48..2586.51 rows=815 width=4)
Sort Key: id
-> Index Scan using idx_table_uid on table_name (cost=0.57..2580.40 rows=815 width=4)
Index Cond: ((uid)::text = '$id'::text)

数据总量在 1.4 亿左右,uid 是索引,感觉两条数据所花费的时间差不多

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

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

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

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

© 2021 V2EX