一房揭、分頁
Mysql的limit用法
limit 接受一個或兩個數(shù)字參數(shù)贤笆。參數(shù)必須是一個整數(shù)常量现斋。如果給定兩個參數(shù)府树,第一個參數(shù)指定第一個返回記錄行的偏移量俐末,第二個參數(shù)指定返回記錄行的最大數(shù)目。初始記錄行的偏移量是 0(而不是 1):
①檢索前100條記錄:0-100
mysql> SELECT * FROM table LIMIT 5; //檢索前 5 個記錄行
等價于
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.
分頁方式
SELECT * FROM tableName WHERE category_id = 123 ORDER BY id LIMIT 50, 10
附:為了提高搜索效率挺尾,最好在category_id, id兩列上建立復(fù)合索引。(此部分為數(shù)據(jù)庫性能優(yōu)化方面的知識)
擴展:索引
SQL索引在數(shù)據(jù)庫優(yōu)化中占有一個非常大的比例站绪, 一個好的索引的設(shè)計遭铺,可以讓你的效率提高幾十甚至幾百倍,在這里將帶你一步步揭開他的神秘面紗。
索引主要目的是提高了SQL Server系統(tǒng)的性能魂挂,加快數(shù)據(jù)的查詢速度與減少系統(tǒng)的響應(yīng)時間
- 什么是索引甫题?
SQL索引有兩種,①聚集索引和②非聚集索引涂召。
下面舉兩個簡單的例子:
舉例一(圖書館的例子):一個圖書館那么多書坠非,怎么管理呢?建立一個字母開頭的目錄果正,例如:a開頭的書炎码,在第一排,b開頭的在第二排秋泳,這樣在找什么書就好說了潦闲,這個就是一個聚集索引,可是很多人借書找某某作者的迫皱,不知道書名怎么辦歉闰?圖書管理員在寫一個目錄,某某作者的書分別在第幾排卓起,第幾排和敬,這就是一個非聚集索引。
舉例二(字典的例子):字典前面的目錄戏阅,可以按照拼音和部首去查詢昼弟,我們想查詢一個字,只需要根據(jù)拼音或者部首去查詢饲握,就可以快速的定位到這個漢字了私杜,這個就是索引的好處,拼音查詢法就是聚集索引救欧,部首查詢就是一個非聚集索引.
看了上面的例子衰粹,下面的一句話大家就很容易理解了:聚集索引存儲記錄是物理上連續(xù)存在,而非聚集索引是邏輯上的連續(xù)笆怠,物理存儲并不連續(xù)铝耻。就像字段,聚集索引是連續(xù)的蹬刷,a后面肯定是b瓢捉,非聚集索引就不連續(xù)了,就像圖書館的某個作者的書办成,有可能在第1個貨架上和第10個貨架上泡态。
還有一個小知識點就是:聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個迂卢。
建立索引的原則如下:
1) 定義主鍵的數(shù)據(jù)列一定要建立索引某弦。
2) 定義有外鍵的數(shù)據(jù)列一定要建立索引桐汤。
3) 對于經(jīng)常查詢的數(shù)據(jù)列最好建立索引。
4) 對于需要在指定范圍內(nèi)的快速或頻繁查詢的數(shù)據(jù)列;
5) 經(jīng)常用在WHERE子句中的數(shù)據(jù)列靶壮。
6) 經(jīng)常出現(xiàn)在關(guān)鍵字order by怔毛、group by、distinct后面的字段腾降,建立索引拣度。如果建立的是復(fù)合索引,索引的字段順序要和這些關(guān)鍵字后面的字段順序一致螃壤,否則索引不會被使用抗果。
7)其他。映穗。窖张。。
二蚁滋、子查詢
但隨著數(shù)據(jù)量的增加宿接,頁數(shù)會越來越多,查看后幾頁的SQL就可能類似:
SELECT * FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 10
一言以蔽之辕录,就是越往后分頁睦霎,LIMIT語句的偏移量就會越大,速度也會明顯變慢走诞。
此時副女,我們可以通過子查詢的方式來提高分頁效率,大致如下:
SELECT * FROM articles WHERE id >=
(SELECT id FROM articles WHERE category_id = 123 ORDER BY id LIMIT 10000, 1) LIMIT 10
SELECT 語句中的子查詢
通常情況下子查詢都與 SELECT 語句一起使用蚣旱,其基本語法如下所示:
SELECT column_name [, column_name ]
FROM table1 [, table2 ]
WHERE column_name OPERATOR
(SELECT column_name [, column_name ]
FROM table1 [, table2 ]
[WHERE])
子查詢(Sub Query)或者說內(nèi)查詢(Inner Query)碑幅,也可以稱作嵌套查詢(Nested Query),是一種嵌套在其他 SQL 查詢的 WHERE 子句中的查詢塞绿。
子查詢用于為主查詢返回其所需數(shù)據(jù)沟涨,或者對檢索數(shù)據(jù)進行進一步的限制。
Join相關(guān)
其他文章
[MySQL的ORDERBY...LIMIT優(yōu)化思路 ]
(http://blog.163.com/li_hx/blog/static/18399141320143351538647/)