MySQL?中的?LIMIT?語句及基本用法
MySQL 中的 LIMIT 語句
LIMIT 語句用于限制查詢返回的行數(shù),常用于分頁查詢或取部分數(shù)據(jù),提高查詢效率。
1. LIMIT 語法
SELECT 列名1, 列名2, ... FROM 表名 WHERE 條件 ORDER BY 排序字段 LIMIT 記錄數(shù) OFFSET 偏移量;
或:
SELECT 列名1, 列名2, ... FROM 表名 WHERE 條件 ORDER BY 排序字段 LIMIT 偏移量, 記錄數(shù);
?? LIMIT 偏移量, 記錄數(shù) 和 LIMIT 記錄數(shù) OFFSET 偏移量 作用相同。
2.LIMIT基本用法
(1) 獲取前 N 行數(shù)據(jù)
SELECT * FROM users LIMIT 5;
返回表 users 的前 5 行數(shù)據(jù)。
(2) LIMIT 結(jié)合 ORDER BY
如果不排序,返回的數(shù)據(jù)可能不穩(wěn)定(順序不確定)。
SELECT * FROM users ORDER BY age DESC LIMIT 5;
先按 age 降序排序,再取前 5 行數(shù)據(jù)。
(3) LIMIT 進行分頁查詢
如果要獲取第 11 到 20 條記錄:
SELECT * FROM users ORDER BY id ASC LIMIT 10 OFFSET 10;
或:
SELECT * FROM users ORDER BY id ASC LIMIT 10, 10;
?? 等效于 LIMIT 10 OFFSET 10,其中:
10是 偏移量(OFFSET),表示跳過前 10 條數(shù)據(jù)。10是 返回的行數(shù)(LIMIT)。
?? 分頁查詢公式:
LIMIT 每頁條數(shù) OFFSET (當前頁 - 1) * 每頁條數(shù);
例如:
第 1 頁(前 10 條):LIMIT 10 OFFSET 0第 2 頁(第 11-20 條):LIMIT 10 OFFSET 10第 3 頁(第 21-30 條):LIMIT 10 OFFSET 20
3. LIMIT 結(jié)合 COUNT()
(1) 統(tǒng)計總記錄數(shù)
分頁時,通常要先獲取總記錄數(shù):
SELECT COUNT(*) FROM users;
?? COUNT(\*) 更快,不會忽略 NULL。
4. LIMIT 結(jié)合 RAND()(隨機取數(shù)據(jù))
如果想要隨機返回 3 條記錄:
SELECT * FROM users ORDER BY RAND() LIMIT 3;
?? ? 注意:
ORDER BY RAND() 性能較低,會對所有數(shù)據(jù)進行排序再取值。
更高效的隨機查詢(適用于 id 遞增的數(shù)據(jù)表):
SELECT * FROM users WHERE id >= (SELECT FLOOR(RAND() * (SELECT MAX(id) FROM users))) LIMIT 3;
5. LIMIT 語句的性能優(yōu)化
(1) LIMIT OFFSET 可能導(dǎo)致性能下降
當 OFFSET 很大時:
SELECT * FROM users ORDER BY id LIMIT 10 OFFSET 100000;
MySQL 仍然會掃描 100000 行,然后丟棄前 100000 條數(shù)據(jù),只返回 10 條,影響性能。
優(yōu)化方法:用索引加條件替代 OFFSET
SELECT * FROM users WHERE id > 100000 ORDER BY id LIMIT 10;
?? 適用于 id 是自增主鍵的情況,查詢速度更快。
(2) LIMIT 結(jié)合 JOIN 可能引發(fā)性能問題
SELECT * FROM users JOIN orders ON users.id = orders.user_id ORDER BY users.id LIMIT 100000, 10;
?? 如果 users.id 沒有索引,查詢會很慢。
優(yōu)化方法:
SELECT users.* FROM users WHERE users.id > (SELECT id FROM users ORDER BY id LIMIT 100000, 1) ORDER BY users.id LIMIT 10;
先找到偏移的起點,再 LIMIT 取值,減少掃描行數(shù)。
6. LIMIT 結(jié)合 GROUP BY
如果要獲取每個城市的前 3 名用戶:
SELECT * FROM (
SELECT *, ROW_NUMBER() OVER (PARTITION BY city ORDER BY age DESC) AS rank
FROM users
) AS temp WHERE rank <= 3;?? ROW_NUMBER() 需要 MySQL 8.0+ 才支持。
7. LIMIT 結(jié)合 DISTINCT
如果要獲取唯一數(shù)據(jù)的前 5 條:
SELECT DISTINCT city FROM users LIMIT 5;
?? LIMIT 在 DISTINCT 之后生效,只返回 5 個唯一的 city。
8. LIMIT 語句總結(jié)
| 用法 | 語法示例 | 說明 |
|---|---|---|
| 獲取前 N 行 | LIMIT 5 | 取前 5 條數(shù)據(jù) |
| 分頁查詢 | LIMIT 10 OFFSET 10 | 取第 11-20 條數(shù)據(jù) |
| 隨機取 N 條 | ORDER BY RAND() LIMIT 3 | 隨機返回 3 條數(shù)據(jù) |
| 統(tǒng)計總數(shù) | SELECT COUNT(*) FROM users; | 獲取總記錄數(shù) |
| 優(yōu)化大偏移 | WHERE id > (SELECT id FROM users LIMIT 100000, 1) LIMIT 10; | 避免 OFFSET 性能問題 |
?? 重點總結(jié)
LIMIT 限制查詢返回的行數(shù),用于分頁或取部分數(shù)據(jù)。
LIMIT 偏移量, 行數(shù) 等價于 LIMIT 行數(shù) OFFSET 偏移量。
ORDER BY + LIMIT 確保數(shù)據(jù)順序穩(wěn)定。
ORDER BY RAND() 效率低,大數(shù)據(jù)表建議用更優(yōu)化的隨機查詢。
大 OFFSET 查詢效率低,建議用索引優(yōu)化查詢。
這樣,你的 LIMIT 查詢就會更快、更高效!??
到此這篇關(guān)于MySQL 中的 LIMIT 語句的文章就介紹到這了,更多相關(guān)mysql limit語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Mysql中大小寫敏感問題導(dǎo)致的MySql Error 1146 Tabel doen’t exist錯誤
這篇文章主要介紹了Mysql中大小寫敏感問題導(dǎo)致的MySql Error 1146 Tabel doen’t exist錯誤,需要的朋友可以參考下2014-10-10
MySQL 文本文件的導(dǎo)入導(dǎo)出數(shù)據(jù)的方法

