索引在表的列上建立。索引是一種資料結構,索引包含乙個表中列的值,並且這些值儲存在乙個資料結構中。
使用索引的全部意義就是通過縮小一張表中需要查詢的記錄/行的數目來加快搜尋的速度。
索引的乙個主要目的就是加快檢索表中資料的方法,能協助資訊搜尋者盡快的找到符合限制條件的記錄id的輔助資料結構。索引儲存了指向表中某一行的指標。
如果沒有索引:select * from table1 where idcard="123456789",必須遍歷整個表,直到idcard等於123456789的這一行被找到為止;有了索引之後,即可在索引中查詢。由於索引是經過演算法優化過的,因而查詢次數要少的多。簡而言之,索引是用來定位的。
索引使用原則:表中的某一列或者某幾列在查詢過程中使用得非常頻繁,那就應按需在該列上建立索引。
1.聚集索引(主鍵索引):在資料庫裡面,所有行數都會按照主鍵索引進行排序。
2.非聚集索引:
普通分類:
(1) 唯一索引
作用:避免同乙個表中某資料列中的值重複
與主鍵索引的區別:主鍵索引只能有乙個,唯一索引可有多個
(2) 普通索引
作用:快速定位特定資料
注意:index 和 key 關鍵字都可以設定常規索引,但不要加太多普通索引,會影響資料的變更效率
(3) 全文索引
作用:快速定位特定資料
按索引列個數分類:
(1) 單行索引:單資料列
(2) 復合索引:多資料列組成的復合索引。復合索引使用原則:最左原則,有a、b、c三個字段建立的聯合索引,如果a欄位在查詢時為空,那麼這個復合索引不生效;如果a欄位不為空,b、c不管為不為空,那麼復合索引都是生效的。
並不是,很多sql都不會使用到建立的索引。比如:
1. 模糊查詢以%開頭,如 like
"%nanci
"
2. 索引列進行表示式計算或者函式式操作
3. 索引列用了 != ,or, in(多個值)
備註:in裡面如果只有乙個值,例如:age in(12) 是等同於age=12的,會使用到索引。
4. 在where子句中進行null值判斷:age is null( is not null)
5.復合索引不滿足最左原則
資料庫索引並不是越多越好,心裡要有一把稱,適可而止,恰到好處。
1.索引會占用空間:表越大,索引佔的空間越大。
2.資料庫效能:主要是在表中新增、修改和刪除資料時,索引也會有相同的操作。建立在某列或多列的索引需要儲存該列最新的資料。
hash索引結構的特殊性,其檢索效率非常高,索引的檢索可以一次定位,不像b-tree索引需要從根節點到枝節點,最後才能訪問到頁節點這樣多次的io訪問,所以hash 索引的查詢效率要遠高於 b-tree索引。
但是我們日常使用的都是:btree。
使用:btree而不使用hash。最重要的一點,我覺得是:hash索引在任何時候都不能避免表掃瞄。
推薦hash和btree對比的一篇文章:
內容純屬個人觀點。
爬山了這座山,才能看到山下的風景。
看完你就知道什麼是瞎忙與高效
時間是最公平的,每個人一天都是24小時,一年都是365天。但是,不同的人的產出卻是天差地別。人和人的差距為什麼這麼大?而且這種差距,並不是家庭背景 權利財富或天賦帶來的,僅僅是我們對時間的掌控。疲於奔命 vs 善於規劃 瞎忙族和高效人士的時間都安排得很滿,但是卻有本質的區別。瞎忙族是沒有目標和方向的...
什麼是資料庫索引
假設我們有乙個資料庫表 employee,這個表有三個字段 列 分別是 employee name employee age 和employee address。假設表employee 有上千行資料。現在假設我們要從這個表中查詢出所有名字是 jesus 的雇員資訊。我們決定使用下面的查詢語句 資料庫...
什麼是mysql的索引 什麼是資料庫索引
大家平時在開發過程中都避免不了使用資料庫索引,那麼你了解資料庫索引麼,接下來呢,我就簡單講一下什麼是資料庫索引。一 資料索引是幹什麼用的呢?資料庫索引其實就是為了使查詢資料效率快。二 資料庫索引有哪些呢?聚集索引 主鍵索引 在資料庫裡面,所有行數都會按照主鍵索引進行排序。非聚集索引 就是給普通字段加...