資料庫學習 mysql中limit函式優化

2021-06-25 07:43:13 字數 2643 閱讀 2073



使用mysql查詢語句的時候,經常要返回前幾條或者中間某幾行資料,這時可用limit函式:

*from

table

limit 

[offset,

]rows 

|rows offset offset

select * from 表名稱 limit m,n  表示從mysql資料庫表中第m條記錄開始檢索n條記錄

limit 子句可以被用於強制 select 語句返回指定的記錄數。limit 接受乙個或兩個數字引數。引數必須是乙個整數常量。如果給定兩個引數,第乙個引數指定第乙個返回記錄行的偏移量,第二個引數指定返回記錄行的最大數目。初始記錄行的偏移量是 0(而不是 1): 為了與 postgresql 相容,mysql 也支援句法: limit # offset #。

mysql

>

select

*from

table

limit 5,

10;  

//檢索記錄行 6-

15//為了檢索從某乙個偏移量到記錄集的結束所有的記錄行,可以指定第二個引數為 -1

: mysql

>

select

*from

table

limit 95,

-1; //

檢索記錄行 96-

last.

//如果只給定乙個引數,它表示返回最大的記錄行數目: 

mysql

>

select

*from

table

limit 

5;     

//檢索前 

5個記錄行

//換句話說,limit n 等價於 limit 

0,n。

limit函式的優化

利用資料分頁來進行優化,下面我們來比較兩個語句的執行效率:

1、select * from cyclopedia limit 90000,1        1 row in set (8.88) sec

2、select * from cyclopedia where id>=(select max(id) from ( select id from cyclopedia order by id limit 90001) as tmp) limit 100;     100 rows in set (0.23) sec

3、select * from cyclopedia where id>=(select max(id) from ( select id from cyclopedia order by id limit 90000,1) as tmp) limit 100;      100 rows in set (0.19) sec

解析:select * 最好不要隨便用,要本著用什麼,選什麼的原則, select的字段越多,字段資料量越大,速度就越慢。

第2句是先取了前90001條記錄,取其中最大乙個id值作為起始標識,然後利用它可以快速定位下100條記錄;

第3句則是僅僅取90000條記錄後1條,然後取id值作起始標識定位下100條記錄。

很明顯第3句勝出.說明limit並不完全像我之前想象的那樣做全表掃瞄返回limit offset+length條記錄。這樣做只是用增加查詢操作這樣的小代價換得高效能。

此種優化方案同樣可用於ms-sql,而且可能是最好的.因為靠主鍵id來定位起始段總是最快的.

select top 100 * from cyclopedia where id>=(select top 90001 max(id) from ( select id from cyclopedia order by id) as tmp)

所以我們一般可以用id和待選擇的字段(一定要加上索引,索引的順序與查詢條件的順序一致)來優化資料庫操作。

下面是在一篇部落格中看到的測試limit函式的實驗:

1、offset比較小的時候。

select

*from yanxue8_visit limit 10,10

多次執行,時間保持在0.0004-0.0005之間

select

*from yanxue8_visit where vid

>=(

select vid from yanxue8_visit order by vid limit 10,1

) limit 10

多次執行,時間保持在0.0005-0.0006之間,主要是0.0006

結論:偏移offset較小的時候,直接使用limit較優。這個顯然是子查詢的原因。

2、offset大的時候。

select

*from yanxue8_visit limit 10000,10

多次執行,時間保持在0.0187左右

select

*from yanxue8_visit where vid

>=(

select vid from yanxue8_visit order by vid limit 10000,1

) limit 10

多次執行,時間保持在0.0061左右,只有前者的1/3。可以預計offset越大,後者越優。

mysql資料庫中的 MySQL資料庫中定義

定義資料表 假如某個電腦生產商,它的資料庫中儲存著整機和配件的產品資訊。用來儲存整機產品資訊的表叫做pc 用來儲存配件供貨資訊的表叫做parts。在pc表中有乙個字段,用來描述這款電腦所使用的cpu型號 在parts表中相應有乙個字段,描述的正是cpu的型號,我們可以把它想成是全部cpu的型號列表。...

Mysql資料庫學習

進入mysql終端,輸入密碼後可進入操作終端 mysql u root p 檢視當前存在的資料庫 show databases 使用資料庫 use dbname 檢視當前資料庫中存在的表 show tables 檢視表結構 desc tablename 檢視mysql編碼命令 檢視資料庫mysql編...

mysql資料庫學習

sql structured query language 結構化查詢語言 ddl 資料定義語言 create drop alter dml data manipulation language insert delete update dql data query language select ...