MySQL 中的 LIMIT 語句及基本用法
MySQL 中的 LIMIT 語句
LIMIT
語句用于限制查詢返回的行數(shù),常用于分頁查詢或取部分?jǐn)?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 進(jìn)行分頁查詢
如果要獲取第 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 (當(dāng)前頁 - 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()(隨機(jī)取數(shù)據(jù))
如果想要隨機(jī)返回 3 條記錄:
SELECT * FROM users ORDER BY RAND() LIMIT 3;
?? ? 注意:
ORDER BY RAND()
性能較低,會對所有數(shù)據(jù)進(jìn)行排序再取值。
更高效的隨機(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)致性能下降
當(dāng) 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;
先找到偏移的起點(diǎn),再 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ù) |
隨機(jī)取 N 條 | ORDER BY RAND() LIMIT 3 | 隨機(jī)返回 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 性能問題 |
?? 重點(diǎn)總結(jié)
LIMIT
限制查詢返回的行數(shù),用于分頁或取部分?jǐn)?shù)據(jù)。LIMIT 偏移量, 行數(shù)
等價于LIMIT 行數(shù) OFFSET 偏移量
。ORDER BY
+LIMIT
確保數(shù)據(jù)順序穩(wěn)定。ORDER BY RAND()
效率低,大數(shù)據(jù)表建議用更優(yōu)化的隨機(jī)查詢。- 大
OFFSET
查詢效率低,建議用索引優(yōu)化查詢。
這樣,你的 LIMIT
查詢就會更快、更高效!??
到此這篇關(guān)于MySQL 中的 LIMIT 語句及基本用法的文章就介紹到這了,更多相關(guān)MySQL LIMIT 語句內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
MySql 8.0.16版本安裝提示已經(jīng)不使用“UTF8B3”而是使用“UTF8B4”問題
這篇文章主要介紹了MySql 8.0.16版本安裝提示已經(jīng)不使用“UTF8B3”而是使用“UTF8B4”問題 ,需要的朋友可以參考下2019-07-07MySQL 邏輯備份與恢復(fù)測試的相關(guān)總結(jié)
數(shù)據(jù)庫邏輯備份就是備份軟件按照我們最初所設(shè)計的邏輯關(guān)系,以數(shù)據(jù)庫的邏輯結(jié)構(gòu)對象為單位,將數(shù)據(jù)庫中的數(shù)據(jù)按照預(yù)定義的邏輯關(guān)聯(lián)格式一條一條生成相關(guān)的文本文件,以達(dá)到備份的目的。本文將具體介紹MySQL 邏輯備份的相關(guān)概念及如何做恢復(fù)測試。2021-05-05MySQL SUM()帶條件的求和方法與多條件的求和方法解讀
這篇文章主要介紹了MySQL SUM()帶條件的求和方法與多條件的求和方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-05-05MySQL中LIKE運(yùn)算符的多種使用方式及示例演示
無論是簡單的模式匹配還是復(fù)雜的模式匹配,LIKE運(yùn)算符都提供了強(qiáng)大的功能來滿足不同的匹配需求,通過本文的介紹,我們詳細(xì)了解了在MySQL數(shù)據(jù)庫中使用LIKE運(yùn)算符進(jìn)行模糊匹配的多種方式,感興趣的朋友跟隨小編一起看看吧2023-07-07