資料庫索引mysql
㈠ mysql索引有哪些
如大家所知道的,Mysql目前主要有以下幾種索引類型:FULLTEXT,HASH,BTREE,RTREE。
那麼,這幾種索引有什麼功能和性能上的不同呢?
FULLTEXT
即為全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以創建全文索引。值得一提的是,在數據量較大時候,現將數據放入一個沒有全局索引的表中,然後再用CREATE INDEX創建FULLTEXT索引,要比先為一張表建立FULLTEXT然後再將數據寫入的速度快很多。
全文索引並不是和MyISAM一起誕生的,它的出現是為了解決WHERE name LIKE 「%word%"這類針對文本的模糊查詢效率較低的問題。在沒有全文索引之前,這樣一個查詢語句是要進行遍歷數據表操作的,可見,在數據量較大時是極其的耗時的,如果沒有非同步IO處理,進程將被挾持,很浪費時間,當然這里不對非同步IO作進一步講解,想了解的童鞋,自行谷哥。
㈡ MySQL 索引是怎麼實現的
索引是滿足某種特定查找演算法的數據結構,而這些數據結構會以某種方式指向數據,從而實現高效查找數據。
具體來說 MySQL 中的索引,不同的數據引擎實現有所不同,但目前主流的資料庫引擎的索引都是 B+ 樹實現的,B+ 樹的搜索效率,可以到達二分法的性能,找到數據區域之後就找到了完整的數據結構了,所有索引的性能也是更好的。
㈢ Mysql建立索引經驗
在實際開發中使用資料庫時,難免會遇到一些大表數據,對這些數據進行查詢時,有時候SQL會查詢得特別慢,這時候,有經驗的老師傅會告訴你,你看一下哪幾個欄位查的多,加一個索引就好了。
那麼,怎麼合理地建立索引呢?這里分享一下我的一些經驗,如有不妥之處,歡迎批評指正。
1、不要盲目建立索引 , 先分析再創建
索引雖然能大幅度提升我們的查詢性能,但也要知道,在你進行增刪改時,索引樹也要同樣地進行維護。所以,索引不是越多越好,而是按需建立。最好是在一整塊模塊開發完成後,分析一下,去針對大多數的查詢,建立聯合索引。
2、使用聯合索引盡量覆蓋多的條件
這是說在一個慢sql里假如有五個where ,一個 order by ,那麼我們的聯合索引盡量覆蓋到這五個查詢條件,如果有必要,order by 也覆蓋上 。
3、小基數欄位不需要索引
這個意思是,如果一張表裡某個欄位的值只有那麼幾個,那麼你針對這個欄位建立的索引其實沒什麼意義,比如說,一個性別欄位就兩種結果,你建了索引,排序也沒什麼意思(也就是索引里把男女給分開了)
所以說,索引盡量選擇基數大的數據去建立宴肆,能最大化地利用索引
4、長字元串可以使用前綴索引
我們建立索引的欄位盡量選擇欄位類型知喚較小的,比如一個varchar(20)和varchar(256)的,我們在20的上晌猛轎面建立的索引和在256上就有明顯的差距(字元串那麼長排序也不好排呀,唉)。
當然,如果一定是要對varchar(256)建立索引,我們可以選擇裡面的前20個字元放在索引樹里(這里的20不絕對,選擇能盡量分辨數據的最小字元欄位設計),類似這樣KEY index(name(20),age,job) ,索引只會對name的前20個字元進行搜索,但前綴索引無法適用於order by 和 group by。
5、對排序欄位設計索引的優先順序低
如果一個SQL里我們出現了范圍查找,後邊又跟著一個排序欄位,那麼我們優先給范圍查找的欄位設置索引,而不是優先排序。
6、如果出現慢SQL,可以設計一個只針對該條SQL的聯合索引。
不過慢SQL的優化,需要一步步去進行分析,可以先用explain查看SQL語句的分析結果,再針對結果去做相應的改進。explain的東西我們下次再講。
PS:在 select 語句之前增加 explain 關鍵字,MySQL 會在查詢上設置一個標記,執行查詢會返回執行計劃的信息,而不是 執行這條SQL。
㈣ 資料庫基礎:講解MySQL索引的概念及資料庫索引的應用[1]
資料庫引入了索引
用戶對資料庫最頻繁的操作是進行數據查詢 一般情況下 資料庫在進行查詢操作時需要對整個表進行數據搜索 當表中的數據很多時 搜索數據就需要很長的時間 這就造成了伺服器的資源浪費 為了提高檢索數據的能力 資料庫引入了索引機制
有關 索引 的比喻
從某種程度上 可以把資料庫看作一本書 把索引看作書的目錄 通過目錄查找書中的信息 顯然較沒有目錄的書方便 快捷
資料庫索引實際是什麼告滲?(兩部分組成)
索引是一個單獨的 物理的資料庫結構 它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單
索引在表中的角色
一個表的存儲是由兩部分組成的 一部分用來存放表的數據頁面 另一部分存放索引頁面 索引就存放在索引頁面上
索引高效原理
通常 索引頁面相對於數據頁面來說小得多 當進行數據檢索時 系統先搜索索引頁面 從中找到所需數據的指針 再直接通過指針從數據頁面中讀取數據
索引的分類
在SQL Server 的資料庫中按存儲結構的不同將索引分為兩類 簇索引(Clustered Index)和非簇索引(Nonclustered Index)
( )簇索引對表的物理數據頁中的數據按列進行排序 然後再重新存儲到磁碟上 即簇索引與數據是混為一體 的它的葉節點中存儲的是實際的數據 由於簇索引對表中的數據一一進行了排序 因此用簇索引查找數據很快 但由於簇索引將表的所有數據完全重新排列了 它所需要的空間也就特別大 大概相當於表中數據所佔空間的 % 表的數據行只能以一種排序方式存儲在磁碟上 所以一個表只能有一個簇索引
( )非簇索引具有與表的數據完全分離的結構 使用非簇索引不用將物理數據頁中的數據按列襪友鍵排序 非簇索引的葉節點中存儲了組成非簇索引的關鍵字的值和行定位器 行定位器的結構和存儲內容取決於數據的存儲方式 如果數據是以簇索引方式存儲的 則行定位器中存儲的是簇索引的索引鍵;如果數據不是以簇索引方式存儲的 這種方式又稱為堆存儲方式(Heap Structure) 則行定位器存儲的是指向數據行的指針 非簇索引將行定位器按關鍵字的值用一定的方式排序 這個順序與表的行在數據頁中的排序是不匹配的 由於非簇索引使用索引頁存儲因此它比簇索引需要更多的存儲空間且檢索效率較低但一個表只能建一個簇索引 當用戶需要建立多個索引時就需要使用非簇索引了
小結 Clustered Index 是與物理數據混在一起並對物理數據進重排 就像使用拼音查字典;Unclustered Index 是與物理數據完全分離的 利用額外空間對關鍵字進行重排 就像使用部首查字典
資料庫索引應用
一 索引的概念
索引就是加快檢索表中數據的方法 資料庫的索引類似於書籍的索引 在書籍中 索引允許用戶不必翻閱完整個書就能迅速地找到所需要的信息 在資料庫中 索引也允許資料庫程序迅速地找到表中的數據 而不必掃描整個資料庫
二 索引的特點
索引可以加快資料庫的檢索速度
索引降低了資料庫插入 修改 刪除等維護任務的速度
索引創建在表上 不能創建在視圖上
索引既可以直接創建 也可以間接創建
可以在優化隱藏中 使用索引
使用查詢處理器執行SQL語句 在一個表上 一次只能使用一個索引
其他
三 索引的優點
創建唯一性索引 保證資料庫表中每一行數據的唯一性
大大加快數據的檢索速度 這也是創建索引的最主要的原因
加速表和表之間的連接 特別是在實現數據的參考完整性方面特別有意義
在使用分組和排序子句進行數據檢索時 同樣可以顯著減少查詢中分組和排序的時間
通過使用索引 可以在查詢告巧的過程中使用優化隱藏器 提高系統的性能
四 索引的缺點
創建索引和維護索引要耗費時間 這種時間隨著數據量的增加而增加
索引需要佔物理空間 除了數據表占數據空間之外 每一個索引還要佔一定的物理空間 如果要建立聚簇索引 那麼需要的空間就會更大
當對表中的數據進行增加 刪除和修改的時候 索引也要動態的維護 降低了數據的維護速度
lishixin/Article/program/MySQL/201311/29604
㈤ 解釋mysql中什麼是索引它的作用是什麼
索引的意義 ·索引在資料庫中的作用相當於目錄在書籍中的作用類似,都用來提高查找信息的速度。 ·索引是一個表中所包含值的列表,其中註明了表中包含各個值的行所在的存儲位置,使用索引查找數據時,先從索引對象中獲得相關列的存儲位置,然後再直接去其存儲位置查找所需信息,這樣就無需對這個表進行掃描,從而可以快速的找到所需數據。
㈥ mysql資料庫是否可以為視圖創建索引,可以的話,請問如果創建
mysql資料庫可以為視圖創建索引,創建方法為:
1、在mysql資料庫中為數據表創建索引時,可在創建表的時候直接創建索引,如下圖創建普通索引。
㈦ 資料庫基礎:講解MySQL索引的概念及資料庫索引的應用[2]
五 索引分類
直接創建索引和間接創建索引
直接創建索引 CREATE INDEX mycolumn_index ON mytable (myclumn)
間接創建索引 定義主鍵約束或者唯一性鍵約束 可以間接創建索引
普通索引和唯一性索引
普通索引 CREATE INDEX mycolumn_index ON mytable (myclumn)
唯一性索引 保證在索引列中的全部數據是唯一的 對聚簇索引和非聚簇索引都可以使用
CREATE UNIQUE COUSTERED INDEX myclumn_cindex ON mytable(mycolumn)
單個索引和復合索引
單個索引 即非復合索引
復合索引 又叫組合索引 在索引建立語句中同時包含多個欄位名 最多 個欄位
CREATE INDEX name_index ON username(firstname lastname)
聚簇索引和非聚簇索引(聚集索引 群集索引)
聚簇索引 物理索引 與基表的物理順序相同 數據值的順序總是按照順序排列
CREATE CLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn) WITH
ALLOW_DUP_ROW(允許有重復記錄的聚簇索引)
非聚簇索引 CREATE UNCLUSTERED INDEX mycolumn_cindex ON mytable(mycolumn)
六 索引的使用
當欄位數據更新頻率較低 查詢使用頻率較高並且存在大量重復值是建議備裂使用聚簇索引
經常同時存取多列 且每列都含有重復值可考慮建立組合索引
復合索引的前導列一定好控制好 否則無法起到索引的效果 如果查詢時前導列不在查詢條件中則該復合索引不會被使用 前導列一定是使用最頻繁的列
多表操作在被實際執行前 查詢優化器會根據連接條件 列出幾組可能的連接方案並從中找出系統開銷最小的最佳方案 連接條件要充份考慮帶有索引的表 行數多的表;內外表的選擇可由公式 外層表中的匹配行數*內層表中每一次查找的次數確定 乘積最小為最佳方案
where子句中對列的任何操作結果都是在sql運行時逐列計算得到的 因此它不得不進行表搜索 而沒有使用該列上面的索引;如果這些結果在查詢編譯時就能得到 那麼就可以被sql優化器優化 使用索引 避免表搜索(例 select * from record where substring(card_no )=
&& select * from record where card_no like % )任何對列的操作都將導致表掃描 它包括資料庫函數 計算表達式等等 查詢時要盡可能將操困彎作移至等號右邊
where條件中的 in 在邏輯上相當於 or 所以語法分析器會將in ( ′ ′)轉化為column= ′ or column= ′來執行 我們期望它會根據每個or子句分別查找 再將結果相加 這樣仿尺閉可以利用column上的索引;但實際上它卻採用了 or策略 即先取出滿足每個or子句的行 存入臨時資料庫的工作表中 再建立唯一索引以去掉重復行 最後從這個臨時表中計算結果 因此 實際過程沒有利用column上索引 並且完成時間還要受tempdb資料庫性能的影響 in or子句常會使用工作表 使索引失效;如果不產生大量重復值 可以考慮把子句拆開;拆開的子句中應該包含索引
要善於使用存儲過程 它使sql變得更加靈活和高效
lishixin/Article/program/MySQL/201311/29603