通俗的說,索引的作用就像目錄一樣,是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。索引中包含由表或檢視中的一列或多列生成的鍵。這些鍵儲存在乙個結構(btree)中,使sql可以快速有效地查詢與鍵值關聯的行。
這是因為,建立索引可以大大提高系統的效能。
通過建立唯一性索引,可以保證給資料庫表中每一行資料的唯一性。
可以大大加快資料檢索速度,也就是建立索引的最主要原因
可以加速表和表之間的連線,特別是在實現資料的參考完整性方面特別有意義
在使用分組和排序子句進行資料檢索時,同樣可以顯著減少查詢中分組和排序的時間
通過使用檢索,可以在查詢的過程中,使用優化隱藏器,提高系統的效能
為什麼不每一列都增加乙個索引呢?
建立索引和維護索引要耗費時間,這種時間隨著資料量的增加而增加。
索引需要佔物理空間,除了資料表佔資料空間之外,每乙個索引還要佔一定的物理空間,如果簡歷聚簇索引,那麼需要的空間就會更大
當對表中的資料進行增刪改的時候,索引也要動態的維護,索參數量少的時候,就降低了資料的維護成本
索引分為聚簇索引和非聚簇索引兩種,聚簇索引是按照資料存放的物理位置為順序的,而非聚簇索引就不一樣了;聚簇索引能提高多行檢索的速度,而非聚簇索引對於單行的檢索很快。
根據資料庫的功能,可以在資料庫設計器中建立三種索引:唯一索引、主鍵索引和聚集索引
唯一索引
唯一索引是不允許其中任何兩行具有相同索引值的索引。當現有資料中存在重複的鍵值時,大多數資料庫不允許將新建立的唯一索引與表一起儲存。資料庫還可能防止新增將在表中建立重複鍵值的新資料。例如,如果在employee表中職員的姓(lname)上建立了唯一索引,則任何兩個員工都不能同姓。
主鍵索引
資料庫表經常有一列或多列組合,其值唯一標識表中的每一行。該列稱為表的主鍵。在資料庫關係圖中為表定義主鍵將自動建立主鍵索引,主鍵索引是唯一索引的特定型別。該索引要求主鍵中的每個值都唯一。當在查詢中使用主鍵索引時,它還允許對資料的快速訪問。
聚集索引
在聚集索引中,表中行的物理順序與鍵值的邏輯(索引)順序相同。乙個表只能包含乙個聚集索引。如果某索引不是聚集索引,則表中行的物理順序與鍵值的邏輯順序不匹配。與非聚集索引相比,聚集索引通常提供更快的資料訪問速度。聚集索引和非聚集索引的區別,如字典預設按字母順序排序,讀者如知道某個字的讀音可根據字母順序快速定位。因此聚集索引和表的內容是在一起的。如讀者需查詢某個生僻字,則需按字典前面的索引,舉例按偏旁進行定位,找到該字對應的頁數,再開啟對應頁數找到該字。這種通過兩個地方而查詢到某個字的方式就如非聚集索引。
首先,所謂失效。並不真的就是這個索引被刪除了。而是在某些情況下,dbms不會檢索索引列表了。執行速度和沒有這個索引時的速度一樣。但是再執行另外的一條語句。同樣的索引又正常起作用。所以索引的失效是針對某條sql語句,某個查詢條件的,而不是針對索引本身的。
哪類語句執行時索引不起作用呢。總結如下:
1.索引字段進行判空查詢時。也就是對索引字段判斷是否為null時。語句為is null 或is not null。
select * from softwaredetailinfo where createtime is null
此時就不檢索time欄位上的索引表了。也就是索引在這條語句執行時失效了。接著再執行
select * from softwaredetailinfo where createtime = '2015-04-11 00:00:00'
此時就會檢索索引表了。索引又起作用了。
2. like查詢是以%開頭
select * from softwaredetailinfo where softuseline like '%oqc%'
3. 判斷索引列是否不等於某個值時。『!= ,< >』操作符。
select * from softwaredetailinfo where softuseline != 0
4. 對索引列進行運算。這裡運算包括+-*/等運算。也包括使用函式。比如:
select * from softwaredetailinfo where softuseline +0= 0
此時索引不起作用。
select * from softwaredetailinfo where count(softuseline) = 0
此時索引也不起作用。
也就是說如果不是直接判斷索引欄位列,而是判斷運算或其它函式處理後的索引列索引均不起作用。
5.在where子句中使用or
來連線條件,因為如果兩個欄位中有乙個沒有索引的話,引擎就會放棄索引。
select id from table where num1 = 0 or num2 = 1
6.可以考慮使用between,
但是只能是連續的數值
select id from table where num between 0 and 1
7.避免在where子句中使用in
關於網上說的mysql在使用in
不走索引的問題,嚴謹的來說的話分為倆種情況
走索引的
select id from table where num in (1)
不走索引的
select id from table where num in (1,2)
其實在in裡面,如果只有乙個值的話是等價於num = 1的
8.避免在where子句中=
的左邊使用表示式操作或者函式操作
表示式
select id from table where num / 2 = 1
函式操作
select id from table where substring(name,1,2) = 'wise'
資料庫索引 索引失效
以下情況不走索引 select from student where name like xiaoyao select from student where not score 100 select from student where score 100 select from student w...
資料庫索引失效
索引失效 1 沒有查詢條件,或者查詢條件沒有建立索引 2 在查詢條件上沒有使用引導列 3 查詢的數量是大表的大部分,應該是30 以上。4 索引本身失效 5 查詢條件使用函式在索引列上 見12 6 對小表查詢 7 提示不使用索引 8 統計資料不真實 9 cbo計算走索引花費過大的情況。其實也包含了上面...
資料庫索引失效
作資料庫索引能起到優化資料庫查詢,提高查詢效率的作用。並且對也稍微大一點的資料量的服務來說,索引的建立是必須的,也是關鍵的。但是索引也要合理應用,不要遇到查詢就建索引,也不能亂建。如果造成索引失效那還不如不建。索引失效有的時候是因為自己的語句問題造成的。下面是幾種造成索引失效的幾種原因,一 以下的方...