一、分頁(yè)
Mysql的limit用法
limit 接受一個(gè)或兩個(gè)數(shù)字參數(shù)。參數(shù)必須是一個(gè)整數(shù)常量。如果給定兩個(gè)參數(shù),第一個(gè)參數(shù)指定第一個(gè)返回記錄行的偏移量,第二個(gè)參數(shù)指定返回記錄行的最大數(shù)目。初始記錄行的偏移量是 0(而不是 1):
①檢索前100條記錄:0-100
mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個(gè)記錄行
等價(jià)于
mysql> SELECT * FROM table LIMIT 0,5;
②檢索中間記錄:101-150
mysql> SELECT * FROM table LIMIT 100,50; // 檢索記錄行 101-150
③檢索剩余記錄:151到結(jié)束的所有
mysql> SELECT * FROM table LIMIT 150,-1; // 檢索記錄行 151-last.
分頁(yè)方式
SELECT * FROM tableName WHERE category_id = 123 ORDER BY id LIMIT 50, 10
附:為了提高搜索效率,最好在category_id, id兩列上建立復(fù)合索引。(此部分為數(shù)據(jù)庫(kù)性能優(yōu)化方面的知識(shí))
擴(kuò)展:索引
SQL索引在數(shù)據(jù)庫(kù)優(yōu)化中占有一個(gè)非常大的比例, 一個(gè)好的索引的設(shè)計(jì),可以讓你的效率提高幾十甚至幾百倍,在這里將帶你一步步揭開(kāi)他的神秘面紗。
索引主要目的是提高了SQL Server系統(tǒng)的性能,加快數(shù)據(jù)的查詢(xún)速度與減少系統(tǒng)的響應(yīng)時(shí)間
- 什么是索引?
SQL索引有兩種,①聚集索引和②非聚集索引。
下面舉兩個(gè)簡(jiǎn)單的例子:
舉例一(圖書(shū)館的例子):一個(gè)圖書(shū)館那么多書(shū),怎么管理呢?建立一個(gè)字母開(kāi)頭的目錄,例如:a開(kāi)頭的書(shū),在第一排,b開(kāi)頭的在第二排,這樣在找什么書(shū)就好說(shuō)了,這個(gè)就是一個(gè)聚集索引,可是很多人借書(shū)找某某作者的,不知道書(shū)名怎么辦?圖書(shū)管理員在寫(xiě)一個(gè)目錄,某某作者的書(shū)分別在第幾排,第幾排,這就是一個(gè)非聚集索引。
舉例二(字典的例子):字典前面的目錄,可以按照拼音和部首去查詢(xún),我們想查詢(xún)一個(gè)字,只需要根據(jù)拼音或者部首去查詢(xún),就可以快速的定位到這個(gè)漢字了,這個(gè)就是索引的好處,拼音查詢(xún)法就是聚集索引,部首查詢(xún)就是一個(gè)非聚集索引.
看了上面的例子,下面的一句話大家就很容易理解了:聚集索引存儲(chǔ)記錄是物理上連續(xù)存在,而非聚集索引是邏輯上的連續(xù),物理存儲(chǔ)并不連續(xù)。就像字段,聚集索引是連續(xù)的,a后面肯定是b,非聚集索引就不連續(xù)了,就像圖書(shū)館的某個(gè)作者的書(shū),有可能在第1個(gè)貨架上和第10個(gè)貨架上。
還有一個(gè)小知識(shí)點(diǎn)就是:聚集索引一個(gè)表只能有一個(gè),而非聚集索引一個(gè)表可以存在多個(gè)。
建立索引的原則如下:
1) 定義主鍵的數(shù)據(jù)列一定要建立索引。
2) 定義有外鍵的數(shù)據(jù)列一定要建立索引。
3) 對(duì)于經(jīng)常查詢(xún)的數(shù)據(jù)列最好建立索引。
4) 對(duì)于需要在指定范圍內(nèi)的快速或頻繁查詢(xún)的數(shù)據(jù)列;
5) 經(jīng)常用在WHERE子句中的數(shù)據(jù)列。
6) 經(jīng)常出現(xiàn)在關(guān)鍵字order by、group by、distinct后面的字段,建立索引。如果建立的是復(fù)合索引,索引的字段順序要和這些關(guān)鍵字后面的字段順序一致,否則索引不會(huì)被使用。
7)其他。。。。
二、子查詢(xún)
但隨著數(shù)據(jù)量的增加,頁(yè)數(shù)會(huì)越來(lái)越多,查看后幾頁(yè)的SQL就可能類(lèi)似:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10
一言以蔽之,就是越往后分頁(yè),LIMIT語(yǔ)句的偏移量就會(huì)越大,速度也會(huì)明顯變慢。
此時(shí),我們可以通過(guò)子查詢(xún)的方式來(lái)提高分頁(yè)效率,大致如下:
SELECT * FROM articles WHERE id >=
(SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10
SELECT 語(yǔ)句中的子查詢(xún)
通常情況下子查詢(xún)都與 SELECT 語(yǔ)句一起使用,其基本語(yǔ)法如下所示:
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
子查詢(xún)(Sub Query)或者說(shuō)內(nèi)查詢(xún)(Inner Query),也可以稱(chēng)作嵌套查詢(xún)(Nested Query),是一種嵌套在其他 SQL 查詢(xún)的 WHERE 子句中的查詢(xún)。
子查詢(xún)用于為主查詢(xún)返回其所需數(shù)據(jù),或者對(duì)檢索數(shù)據(jù)進(jìn)行進(jìn)一步的限制。
Join相關(guān)
其他文章
[MySQL的ORDERBY...LIMIT優(yōu)化思路 ]
(http://blog.163.com/li_hx/blog/static/18399141320143351538647/)