◆ order by + limit 1 のほうが min() よりも速かった
  ◆ postgresql 9.6 + 対象列にインデックスありので確認

SQL を使って最小または最大の 1 件だけほしいということはよくありますよね
ここでは 最小 のほうとします

やり方はだいたいこの 2 種類になるかと思います

ソートとして最初の 1 件を取得
select col from table order by col limit 1

最小を取得する関数を使う
select min(col) from table

比べてみると ソートを使うと 最小だけが欲しくて並べる必要ないのに並べる処理が入るので無駄があって遅そうです
min 関数を使う場合はそれ専用の関数なので最適化などもあって早そうです

実行

とりあえず実行してみます
ダミーデータ入りのテーブルを作ります

const sql = `
create table t
(
id serial NOT NULL,
name text NOT NULL,
ts timestamp without time zone NOT NULL,
constraint t_pkey primary key (id)
);
create index on t (ts);

insert into t (name, ts) values
${
Array.from(Array(100000), () => {
const chars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890-_!#$%&+*@?"
const randchar = () => chars[~~(Math.random() * chars.length)]
const name = Array.from(Array(36), randchar).join("")
const randtime = () => new Date(Date.now() - Math.random() * 1000 * 3600 * 24 * 365 * 10).toJSON()
const ts = randtime()
return `('${name}', '${ts}')`
}).join(",\n")
};

explain select ts from t order by ts limit 1;
explain select min(ts) from t;
explain analyze select ts from t order by ts limit 1;
explain analyze select min(ts) from t;
drop table t;
`
require("fs").writeFileSync("sql.sql", sql)

で SQL ファイルを作って psql に入れます

> psql -U postgres -f ./sql.sql
CREATE TABLE
CREATE INDEX
INSERT 0 100000
QUERY PLAN
-------------------------------------------------------------------------------------
Limit (cost=0.29..0.36 rows=1 width=8)
-> Index Only Scan using t_ts_idx on t (cost=0.29..7295.84 rows=116503 width=8)
(2 行)

QUERY PLAN
---------------------------------------------------------------------------------------------
Result (cost=0.36..0.37 rows=1 width=8)
InitPlan 1 (returns $0)
-> Limit (cost=0.29..0.36 rows=1 width=8)
-> Index Only Scan using t_ts_idx on t (cost=0.29..7572.89 rows=115920 width=8)
Index Cond: (ts IS NOT NULL)
(5 行)

QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.29..0.36 rows=1 width=8) (actual time=0.050..0.051 rows=1 loops=1)
-> Index Only Scan using t_ts_idx on t (cost=0.29..7295.84 rows=116503 width=8) (actual time=0.048..0.048 rows=1 loops=1)
Heap Fetches: 1
Planning time: 0.071 ms
Execution time: 0.977 ms
(5 行)

QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
Result (cost=0.36..0.37 rows=1 width=8) (actual time=0.029..0.029 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Limit (cost=0.29..0.36 rows=1 width=8) (actual time=0.019..0.020 rows=1 loops=1)
-> Index Only Scan using t_ts_idx on t (cost=0.29..7572.89 rows=115920 width=8) (actual time=0.019..0.020 rows=1 loops=1)
Index Cond: (ts IS NOT NULL)
Heap Fetches: 1
Planning time: 0.118 ms
Execution time: 0.052 ms
(8 行)

コスト的には min 関数のほうが大きく予測時間では min 関数を使うほうが時間がかかります
ただ実際の実行時間は min 関数のほうが少なくて予測時間とは逆です

insert してるしメモリ上にあるだろうと思ってましたが 実行時間を見ると 0.977ms と 0.052ms とかなり差があります
初回だから遅い事も考えられるので psql で手動で何度かそれぞれを実行してみました

postgres=# explain analyze select ts from t order by ts limit 1;
QUERY PLAN
-------------------------------------------------------------------------------------------------------------------------------
Limit (cost=0.29..0.36 rows=1 width=8) (actual time=0.027..0.028 rows=1 loops=1)
-> Index Only Scan using t_ts_idx on t (cost=0.29..7048.27 rows=100000 width=8) (actual time=0.025..0.025 rows=1 loops=1)
Heap Fetches: 1
Planning time: 0.114 ms
Execution time: 0.052 ms
(5 行)

postgres=# explain analyze select min(ts) from t;
QUERY PLAN
---------------------------------------------------------------------------------------------------------------------------------------
Result (cost=0.37..0.38 rows=1 width=8) (actual time=0.032..0.032 rows=1 loops=1)
InitPlan 1 (returns $0)
-> Limit (cost=0.29..0.37 rows=1 width=8) (actual time=0.028..0.029 rows=1 loops=1)
-> Index Only Scan using t_ts_idx on t (cost=0.29..7298.27 rows=100000 width=8) (actual time=0.027..0.027 rows=1 loops=1)
Index Cond: (ts IS NOT NULL)
Heap Fetches: 1
Planning time: 0.167 ms
Execution time: 0.064 ms
(8 行)

結果はだいたいこんな感じで予測時間どおり min のほうが時間がかかりました

ちなみにバージョンはしばらく放置してた centos7 なのでちょっと古めです

postgres=# select version();
version
-----------------------------------------------------------------------------------------------------------
PostgreSQL 9.6.11 on x86_64-pc-linux-gnu, compiled by gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-28), 64-bit
(1 行)

まとめ

postgresql 9.6.11 でインデックスついてる場合は min のほうが遅くなりました
一応ココに乗せてるパターン以外のテーブルとデータでも試しましたが同じでした

ただ バージョンや RDS の違い・メモリに乗らないレベルの大きなテーブルの場合・統計情報の状態 などすべての場合でソートして最初の 1 件を取得する方法が速いとは言えないと思うので実際に使う環境で explain してみたほうが良いと思います