SELECT ... FROM table_name
ORDER BY column1 [ASC|DESC], column2 [ASC|DESC], ...
[LIMIT offset, count];
ASC 升序,DESC 降序。| 排序方式 | NULL 位置 |
|---|---|
ORDER BY col ASC | NULL 在最前 |
ORDER BY col DESC | NULL 在最後 |
可用 ORDER BY ISNULL(col), col ASC 強制 NULL 最後,或 ORDER BY col IS NULL, col(MySQL 8.0+ 支援 NULLS FIRST/LAST)。
-- 查詢 jtsr 表,按 jtsr 降序,取前 3 筆
SELECT * FROM jtsr
WHERE id IS NOT NULL
ORDER BY jtsr DESC
LIMIT 3;
+----+------+------+-----+
| id | user | jtsr | sex |
+----+------+------+-----+
| 5 | ggg | 5000 | 男 |
| 4 | fff | 4000 | 男 |
| 3 | ddd | 3000 | 女 |
+----+------+------+-----+
ORDER BY 欄位若有索引且符合最左前綴,可直接掃描索引輸出有序結果,避免 Using filesort。ORDER BY 欄位順序、方向一致(或完全相反)。-- 優化:索引 (jtsr DESC) 直接取前 3,無需全表排序
EXPLAIN SELECT * FROM jtsr ORDER BY jtsr DESC LIMIT 3;
LIMIT 100000, 10 需掃描 10 萬行再丟棄。優化方案:
SELECT * FROM t JOIN (SELECT id FROM t ORDER BY col LIMIT 100000, 10) tmp USING (id)id,下頁查 WHERE id > last_id ORDER BY id LIMIT 10。sort_buffer_size:每個執行緒專用,預設 256KB,大排序可適當調大(如 2MB),但過大會導致記憶體耗盡。max_length_for_sort_data:控制是否使用「額外欄位排序」演算法。