數據庫相關&部分性能優化

一、分頁

Mysql的limit用法

limit 接受一個或兩個數字參數。參數必須是一個整數常量。如果給定兩個參數,第一個參數指定第一個返回記錄行的偏移量,第二個參數指定返回記錄行的最大數目。初始記錄行的偏移量是 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到結束的所有
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兩列上建立復合索引。(此部分為數據庫性能優化方面的知識)

擴展:索引

SQL索引在數據庫優化中占有一個非常大的比例, 一個好的索引的設計,可以讓你的效率提高幾十甚至幾百倍,在這里將帶你一步步揭開他的神秘面紗。
索引主要目的是提高了SQL Server系統的性能,加快數據的查詢速度與減少系統的響應時間

  • 什么是索引?
      SQL索引有兩種,①聚集索引和②非聚集索引。

下面舉兩個簡單的例子:
舉例一(圖書館的例子):一個圖書館那么多書,怎么管理呢?建立一個字母開頭的目錄,例如:a開頭的書,在第一排,b開頭的在第二排,這樣在找什么書就好說了,這個就是一個聚集索引,可是很多人借書找某某作者的,不知道書名怎么辦?圖書管理員在寫一個目錄,某某作者的書分別在第幾排,第幾排,這就是一個非聚集索引。

舉例二(字典的例子):字典前面的目錄,可以按照拼音和部首去查詢,我們想查詢一個字,只需要根據拼音或者部首去查詢,就可以快速的定位到這個漢字了,這個就是索引的好處,拼音查詢法就是聚集索引,部首查詢就是一個非聚集索引.

看了上面的例子,下面的一句話大家就很容易理解了:聚集索引存儲記錄是物理上連續存在,而非聚集索引是邏輯上的連續,物理存儲并不連續。就像字段,聚集索引是連續的,a后面肯定是b,非聚集索引就不連續了,就像圖書館的某個作者的書,有可能在第1個貨架上和第10個貨架上。

還有一個小知識點就是:聚集索引一個表只能有一個,而非聚集索引一個表可以存在多個。

建立索引的原則如下:
1) 定義主鍵的數據列一定要建立索引。
2) 定義有外鍵的數據列一定要建立索引。
3) 對于經常查詢的數據列最好建立索引。
4) 對于需要在指定范圍內的快速或頻繁查詢的數據列;
5) 經常用在WHERE子句中的數據列。
6) 經常出現在關鍵字order by、group by、distinct后面的字段,建立索引。如果建立的是復合索引,索引的字段順序要和這些關鍵字后面的字段順序一致,否則索引不會被使用。
7)其他。。。。

二、子查詢

但隨著數據量的增加,頁數會越來越多,查看后幾頁的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)或者說內查詢(Inner Query),也可以稱作嵌套查詢(Nested Query),是一種嵌套在其他 SQL 查詢的 WHERE 子句中的查詢。
子查詢用于為主查詢返回其所需數據,或者對檢索數據進行進一步的限制。

SQL子查詢的一些例子

Join相關

Join相關知識查看w3school

其他文章
[MySQL的ORDERBY...LIMIT優化思路 ]
(http://blog.163.com/li_hx/blog/static/18399141320143351538647/)

mysql中使用order by 和limit查詢變慢解決辦法

100億數據1萬屬性數據架構設計

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容