大連哪家網(wǎng)站公司好如何做好精準(zhǔn)營銷
1. limit 100000,10 和 limit 10區(qū)別
-
LIMIT 100000, 10
:- 這個語句的意思是,從查詢結(jié)果中跳過前100000條記錄,然后返回接下來的10條記錄。
- 這通常用于分頁查詢中,當(dāng)你需要跳過大量的記錄以獲取后續(xù)的記錄時。例如,如果你有一個包含大量數(shù)據(jù)的查詢結(jié)果,你可能想要查看第100001頁的數(shù)據(jù),每頁顯示10條記錄,這時就會使用這種形式的
LIMIT
子句。
-
LIMIT 10
:- 這個語句的意思是,返回查詢結(jié)果的前10條記錄。
- 這是一個非常常見的用法,用于限制查詢結(jié)果的數(shù)量,特別是在你只需要一小部分?jǐn)?shù)據(jù)時。例如,你可能只想查看表中的前10條記錄,或者在進(jìn)行測試時限制返回的數(shù)據(jù)量。
2. 超大分頁優(yōu)化思路
覆蓋索引加子查詢
優(yōu)化思路:分頁查詢時通過創(chuàng)建覆蓋索引提高性能,再通過覆蓋索引加子查詢的形式進(jìn)行優(yōu)化
舉例:
假設(shè)有一個 users
表,結(jié)構(gòu)如下:
CREATE TABLE users (id INT PRIMARY KEY,name VARCHAR(100),email VARCHAR(100),created_at TIMESTAMP
);
我們想要獲取從第 1000001 條到第 1000010 條記錄的用戶名字(即分頁)
優(yōu)化前的 SQL 查詢
SELECT name FROM users
ORDER BY id
LIMIT 1000000, 10;
全表掃描:這個查詢沒有使用子查詢,因此 MySQL 必須從第一條記錄開始,掃描直到跳過前 1000000 條記錄,然后返回接下來的 10 條記錄。
性能問題:當(dāng)表中的記錄數(shù)非常大時,這種方式會導(dǎo)致顯著的性能下降,因為數(shù)據(jù)庫需要遍歷大量的記錄,導(dǎo)致高的 IO 開銷。
優(yōu)化后的 SQL 查詢
-- 創(chuàng)建覆蓋索引,包含需要查詢的字段(id和name)
CREATE INDEX idx_id_name ON users(id, name);
然后使用子查詢優(yōu)化
SELECT name FROM users
WHERE id IN (SELECT id FROM (SELECT id FROM users ORDER BY id LIMIT 1000000, 10) AS temp
);
內(nèi)部子查詢:SELECT id FROM users ORDER BY id LIMIT 1000000, 10
- 這個子查詢的作用是從
users
表中獲取id
從 1000001 到 1000010 的記錄。 - 這里會使用到
id
的索引來快速定位到對應(yīng)的位置及1000001,而不會從頭開始遍歷所有記錄
外部查詢:SELECT name FROM users WHERE id IN (...)
- 外部查詢使用內(nèi)層子查詢的結(jié)果,獲取這些
id
對應(yīng)的用戶name
。
覆蓋索引的使用
- 覆蓋索引:在
CREATE INDEX idx_id_name ON users(id, name);
中創(chuàng)建的索引包含了查詢需要的所有列id
和name
。 - 由于外部查詢只選擇了
name
列,且查詢條件中使用了id
,MySQL 可以直接從索引中獲取id
和name
,避免了對users
表的回表操作。