資料庫索引失效問題

2021-10-08 14:02:39 字數 3055 閱讀 3847

通俗的說,索引的作用就像目錄一樣,是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。索引中包含由表或檢視中的一列或多列生成的鍵。這些鍵儲存在乙個結構(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計算走索引花費過大的情況。其實也包含了上面...

資料庫索引失效

作資料庫索引能起到優化資料庫查詢,提高查詢效率的作用。並且對也稍微大一點的資料量的服務來說,索引的建立是必須的,也是關鍵的。但是索引也要合理應用,不要遇到查詢就建索引,也不能亂建。如果造成索引失效那還不如不建。索引失效有的時候是因為自己的語句問題造成的。下面是幾種造成索引失效的幾種原因,一 以下的方...