⑴ MySql中查詢語句實現分頁功能
pageNow代表當前頁面,第一頁。
⑵ MySQL鎬庢牱浣跨敤limit鑾峰彇鍏ㄩ儴鏁版嵁(mysql涓鐨刲imit)
MySQL鏁版嵁搴搇imit鍒嗛〉紺轟緥
1.select*frompersonslimitA,B;
瑙i噴錛
A錛屾煡璇㈣搗鐐
B錛岄渶瑕佺殑琛屾暟
2.紺轟緥錛
select*frompersonslimit0,4;
瑙i噴錛
璧風偣浣嶇疆涓0錛屽紑濮嬫煡璇錛岃繑鍥4鏉℃暟鎹銆
select*frompersonslimit4,4;
瑙i噴錛
璧風偣涓4錛屽紑濮嬫煡璇錛岃繑鍥4澶╂暟鎹銆
3.鐗規畩錛
select*frompersonslimit10;
鎰忔濇槸錛岃搗鐐逛負0錛屽紑濮嬫煡璇錛岃繑鍥10鏉¤板綍銆
涓巗elect*frompersonslimit0,10;鏄絳変環鐨勩
4.鎸夎勫垯鎺掑簭鐨勫悓鏃訛紝榪涜屽垎欏碉細
select*frompersons
orderbylastname
limit0,10;
⑶ MySQL百萬級數據量分頁查詢方法及其優化建議
offset+limit方式的分頁查詢,當數據表超過100w條記錄,性能會很差。
主要原因是offset limit的分頁方式是從頭開始查詢,然後舍棄前offset個記錄,所以offset偏移量越大,查詢速度越慢。
比如: 讀第10000到10019行元素(pk是主鍵/唯一鍵).
使用order by id可以在查詢時使用主鍵索引。
但是這種方式在id為uuid的時候就會出現問題。可以使用where in的方式解決:
帶條件的查詢:
如果在分頁查詢中添加了where條件例如 type = 'a』這樣的條件,sql變成 :
這種情況因為type沒有使用索引也會導致查詢速度變慢。但是只添加type為索引查詢速度還是很慢,是因為查詢的數據量太多了。這個時候考慮添加組合索引,組合索引的順序要where條件欄位在前,id在後,如 (type,id),因為組合索引查詢時用到了type索引,而type跟id是組合索引的關系,如果只select id ,那麼直接就可以按組合索引返回id,而不需要再進行一次查詢去返回id
使用uuid作為主鍵不僅會帶來性能上的問題,在查詢時也會遇到問題。
因為在使用select id from table limit 10000,10 查詢id數據時,默認是對id進行排序,返回的是排序後的id結果,如果我們想按插入順序查詢結果,這樣查詢出來的結果就與我們的需求不相符。
聚集索引跟非聚集索引:聚集索引類似與新華字典的拼音,根據拼音搜索到的信息都是連續的,可以很快獲取到它前後的信息。非聚集索引類似於部首查詢,信息存放的位置可能不在一個區域。對經常使用范圍查詢的欄位考慮使用聚集索引。
InnoDB中索引分為聚簇索引(主鍵索引)和非聚簇索引(非主鍵索引),聚簇索引的葉子節點中保存的是整行記錄,而非聚簇索引的葉子節點中保存的是該行記錄的主鍵的值。
如果您的表上定義有主鍵,該主鍵索引是聚集索引。
如果你不定義為您的表的主鍵時,MySQL取第一個唯一索引(unique)而且只含非空列(NOT NULL)作為主鍵,InnoDB使用它作為聚集索引。
如果沒有這樣的列,InnoDB就自己產生一個這樣的ID值,
優先選index key_len小的索引進行count(*),盡量不使用聚簇索引
在沒有where條件的情況下,count(*)和count(常量),如果有非聚簇索引,mysql會自動選擇非聚簇索引,因為非聚簇索引所佔的空間小,如果沒有非聚簇索引會使用聚集索引。count(primary key)主鍵id為聚集索引,使用聚集索引。有where條件的情況下,是否使用索引會根據where條件判斷。
⑷ MySQL大數據量分頁查詢方法及其優化
使用子查詢優化大數據量分頁查詢
這種方式的做法是先定位偏移位置的id,然後再往後查詢,適用於id遞增的情況。
使用id限定優化大數據量分頁查詢
使用這種方式需要先假設數據表的id是連續遞增的,我們根據查詢的頁數和查詢的記錄數可以算出查詢的id的范圍,可以使用 id between and 來查詢:
當然了,也可以使用in的方式來進行查詢,這種方式經常用在多表關聯的情況下,使用其他表查詢的id集合來進行查詢:
但是使用這種in查詢方式的時候要注意的是,某些MySQL版本並不支持在in子句中使用limit子句。
參考 sql優化之大數據量分頁查詢(mysql) - yanggb - 博客園 (cnblogs.com)
⑸ mysql 數據量大的表如何做分頁查詢
直接用limit start, count分頁語句, 也是我程序中用的方法:
select * from proct limit start, count
當起始頁較小時,查詢沒有性能問題,我們分別看下從10, 100, 1000, 10000開始分頁的執行時間(每頁取20條), 如下:
select * from proct limit 10, 20 0.016秒
select * from proct limit 100, 20 0.016秒
select * from proct limit 1000, 20 0.047秒
select * from proct limit 10000, 20 0.094秒
我們已經看出隨著起始記錄的增加,時間也隨著增大, 這說明分頁語句limit跟起始頁碼是有很大關系的,那麼我們把起始記錄改為40w看下(也就是記錄的一般左右) select * from proct limit 400000, 20 3.229秒
再看我們取最後一頁記錄的時間
select * from proct limit 866613, 20 37.44秒
難怪搜索引擎抓取我們頁面的時候經常會報超時,像這種分頁最大的頁碼頁顯然這種時
間是無法忍受的。
從中我們也能總結出兩件事情:
1)limit語句的查詢時間與起始記錄的位置成正比
2)mysql的limit語句是很方便,但是對記錄很多的表並不適合直接使用。