sql優化有很多方法,今天來說一說資料庫索引。
舉例說明:
假設有乙個圖書book表,裡面有欄位id,name, isbn等。如果圖書數量巨大的話,我們通過isbn查詢通常是比較慢的。
新增索引:
create index index_isbn on book (isbn);
查詢時間從0.134縮短到0.001,效果還是很明顯的。
接下來通過乙個故事來說明一下,索引是什麼?
很久以前,在乙個古城的的大圖書館中珍藏有成千上萬本書籍,但書架上的書沒有按任何順序擺放,因此每當有人詢問某本書時,圖書管理員只有挨個尋找,每一次都要花費大量的時間。[這就好比資料表沒有主鍵一樣,搜尋表中的資料時,資料庫引擎必須進行全表掃瞄,效率極其低下。]
更糟的是圖書館的圖書越來越多,圖書管理員的工作變得異常痛苦,有一天來了乙個聰明的小夥子,他看到圖書管理員的痛苦工作後,想出了乙個辦法,他建議將每本書都編上號,然後按編號放到書架上,如果有人指定了圖書編號,那麼圖書管理員很快就可以找到它的位置了。
[給圖書編號就象給表建立主鍵一樣,建立主鍵時,會建立聚集索引樹,表中的所有行會在檔案系統上根據主鍵值進行物理排序,當查詢表中任一行時,資料庫首先使用聚集索引樹找到對應的資料頁(就象首先找到書架一樣),然後在資料頁中根據主鍵鍵值找到目標行(就象找到書架上的書一樣)。]
於是圖書管理員開始給圖書編號,然後根據編號將書放到書架上,為此他花了整整一天時間,但最後經過測試,他發現找書的效率大大提高了。[在乙個表上只能建立乙個聚集索引,就象書只能按一種規則擺放一樣。]
但問題並未完全解決,因為很多人記不住書的編號,只記得書的名字,圖書管理員無賴又只有掃瞄所有的圖書編號挨個尋找,但這次他只花了20分鐘,以前未給圖書編號時要花2-3小時,但與根據圖書編號查詢圖書相比,時間還是太長了,因此他向那個聰明的小夥子求助。
[這就好像你給product表增加了主鍵productid,但除此之外沒有建立其它索引,當使用product name進行檢索時,資料庫引擎又只要進行全表掃瞄,逐個尋找了。]
聰明的小伙告訴圖書管理員,之前已經建立好了圖書編號,現在只需要再建立乙個索引或目錄,將圖書名稱和對應的編號一起儲存起來,但這一次是按圖書名稱進行排序,如果有人想找「database management system」一書,你只需要跳到「d」開頭的目錄,然後按照編號就可以找到圖書了。
於是圖書管理員興奮地花了幾個小時建立了乙個「圖書名稱」目錄,經過測試,現在找一本書的時間縮短到1分鐘了(其中30秒用於從「圖書名稱」目錄中查詢編號,另外根據編號查詢圖書用了30秒)。
圖書管理員開始了新的思考,讀者可能還會根據圖書的其它屬性來找書,如作者,於是他用同樣的辦法為作者也建立了目錄,現在可以根據圖書編號,書名和作者在1分鐘內查詢任何圖書了,圖書管理員的工作變得輕鬆了,故事也到此結束。
通過這個故事很容易理解索引的真正含義。假設我們有乙個products表,建立了乙個聚集索引(根據表的主鍵自動建立的),我們還需要在productname列上建立乙個非聚集索引,建立非聚集索引時,資料庫引擎會為非聚集索引自動建立乙個索引樹(就象故事中的「圖書名稱」目錄一樣),產品名稱會儲存在索引頁中,每個索引頁包括一定範圍的產品名稱和它們對應的主鍵鍵值,當使用產品名稱進行檢索時,資料庫引擎首先會根據產品名稱查詢非聚集索引樹查出主鍵鍵值,然後使用主鍵鍵值查詢聚集索引樹找到最終的產品。
增加普通索引和unique兩種索引。其格式如下:
create index index_name on table_name (column_list) ;
create unique index index_name on table_name (column_list) ;
刪除索引
drop index index_name on table_name ;
alter table table_name drop index index_name ;
SQL優化之索引
舉例說明 假設有乙個圖書book表,裡面有欄位id,name,isbn等。如果圖書數量巨大的話,我們通過isbn查詢通常是比較慢的。這裡寫描述 新增索引 create index index isbn on book isbn 再次執行查詢 這裡寫描述 查詢時間從0.134縮短到0.001,效果還是...
SQL優化之索引使用
最近找工作,遇到乙個面試題 sql哪些關鍵字會忽略索引?因為之前沒這方面的經驗,當時懵逼了,隨便扯了一點。最終有沒能通過面試很遺憾。我們都知道對查詢進行優化,應盡量避免全表掃瞄,多使用索引,首先應考慮在 where 及 order by 涉及的列上建立索引。不過應該注意兩點 1 並不是所有索引對查詢...
SQL優化 索引優化
一 發現哪些sql語句有效能問題 開啟mysql慢查詢日誌對sql語句進行監控 show variables like slow query log 檢視是否開啟慢查詢日誌 set global slow query log on 開啟慢查詢日誌 set global log queries not...