MySQL索引創建

1.什麼是索引?
數據庫的索引,是數據庫管理系統(DBMS)中一個排序的數據結構,以協助快速查詢、更新數據庫表中的數據。
索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。
數據庫使用索引以找到特定值,然後順指針找到包含該值的行。在表中建立索引,然後在索引中找到符合查詢條件的索引值,最後通過保存在索引中的ROWID(相當於頁碼)快速找到表中對應的記錄。索引的建立是表中比較有指向性的字段,相當於目錄,比如說行政區域代碼,同一個地域的行政區域代碼都是相同的,那麼給這一列加上索引,避免讓它重複掃描,從而達到優化的目的!
2、如何創建索引
MySQL的索引類型分別爲:主鍵索引()、普通索引(INDEX)、唯一索引(UNIQUE)、全文索引(FULLTEXT)
a.創建主鍵索引:唯一 且 不能爲空

ALTER TABLE table_name ADD PRIMARY KEY (column_list)

b.創建普通索引:普通的

ALTER TABLE table_name ADD INDEX index_name (column_list)

c.創建唯一索引:不允許有重複

ALTER TABLE table_name ADD UNIQUE (column_list)

d.創建全文索引:用於在一篇文章中,檢索文本信息的

ALTER TABLE  table_name  ADD  FULLTEXT INDEX `full_index` (`column_list`);

3.聯合索引
索引可以簡單如一個列(a),也可以複雜如多個列(a, b, c, d),即聯合索引。
如果是聯合索引,那麼key也由多個列組成,同時,索引只能用於查找key是否存在(相等),遇到範圍查詢(>、<、between、like左匹配)等就不能進一步匹配了,後續退化爲線性查找。因此,列的排列順序決定了可命中索引的列數。

例子:
如有索引(a, b, c, d),查詢條件a = 1 and b = 2 and c > 3 and d = 4,則會在每個節點依次命中a、b、c,無法命中d。(很簡單:索引命中只能是相等的情況,不能是範圍匹配)

創建聯合索引:最左匹配原則

alert table table_name add INDEX `sindex` (`name`,`phone`) 

4.什麼是回表
二級索引無法直接查詢所有列的數據,所以通過二級索引查詢到聚簇索引後,再查詢到想要的數據,這種通過二級索引查詢出來的過程,就叫做回表

5.什麼是覆蓋索引?
select 列 全部包含在 使用的索引當中了。
現在我創建了索引(username,age),在查詢數據的時候:select username , age from user where username = ‘Java3y’ and age = 20。
很明顯地知道,我們上邊的查詢是走索引的,並且,要查詢出的列在葉子節點都存在!所以,就不用回表了~


總結
索引在數據庫中是一個非常重要的知識點!上面談的其實就是索引最基本的東西,要創建出好的索引要顧及到很多的方面:

1,最左前綴匹配原則。這是非常重要、非常重要、非常重要(重要的事情說三遍)的原則,MySQL會一直向右匹配直到遇到範圍查詢(>,<,BETWEEN,LIKE)就停止匹配。
2,儘量選擇區分度高的列作爲索引,區分度的公式是 COUNT(DISTINCT col) / COUNT(*)。表示字段不重複的比率,比率越大我們掃描的記錄數就越少。
3,索引列不能參與計算,儘量保持列“乾淨”。比如,FROM_UNIXTIME(create_time) = ‘2016-06-06’ 就不能使用索引,原因很簡單,B+樹中存儲的都是數據表中的字段值,但是進行檢索時,需要把所有元素都應用函數才能比較,顯然這樣的代價太大。所以語句要寫成 : create_time = UNIX_TIMESTAMP(‘2016-06-06’)。
4,儘可能的擴展索引,不要新建立索引。比如表中已經有了a的索引,現在要加(a,b)的索引,那麼只需要修改原來的索引即可。
5,單個多列組合索引和多個單列索引的檢索查詢效果不同,因爲在執行SQL時,MySQL只能使用一個索引,會從多個單列索引中選擇一個限制最爲嚴格的索引。

發佈了60 篇原創文章 · 獲贊 62 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章