關於資料庫索引

2021-08-20 14:54:18 字數 2622 閱讀 4953

i:mysql資料庫索引型別

(1)   唯一索引:不允許表中任意兩行具有相同值的索引。

(2)   非唯一索引:允許其中任何兩行具有相同索引值的索引。

(3)   主鍵索引:資料庫表中有一列或列組合,其值唯一標識表中的每一行。

(4)   聚集索引: 表中記錄的物理順序與索引的順序一致。一張表只能有乙個聚集索引。

(5)  非聚集索引:表中記錄的物理順序和索引的順序不一致。

(6)  聯合索引:又叫做復合索引,兩個或多個列上的索引被稱作復合索引。mysql從左到右的使用索引中的字段,乙個查詢可以只使用索引中的一部分,但只能是最左側部分。例如索引是key index(a,b,c),可以支援a|a,b|a,b,c三種組合進行查詢,但不支援b,c進行查詢。

ii:唯一索引和主鍵索引的區別:乙個表中只能有乙個主鍵索引,而乙個表中可以有多個唯一索引;主鍵可以被其他表引用為外來鍵,而唯一索引不能。

iii:索引實現原理:b+

iv:建立索引的優缺點:

優點:是可以加快資料的檢索速度;

缺點:建立和維護索引需要耗費時間;除了資料表需要占用空間外,索引也需要占用空間;當對表中資料進行增加、刪除和修改時,索引也要動態維護,這樣就降低了資料的維護速度。

v:非聚集索引和聚集索引的區別:

聚集索引

非聚集索引

b+樹實現

b+樹實現

葉子節點儲存真實的資料

葉子節點儲存指向真實資料的指標

表中記錄的物理順序與索引的順序一致

非聚集索引:表中記錄的物理順序和索引的順序不一致。

vi:會使索引失效的情況

(1)條件中有or,即使其中有條件帶索引也不會使用(要想既使用or,又不想讓索引失效,只能將or條件中每個列都加上索引)。解決方法:通過union連線多條select語句。

(2)like查詢並且以%開頭。解決方法:使用fulltext(全文本搜尋)代替like。

(3)若列型別為字串,則一定要在條件中將資料用引號引起來,否則不使用索引。

(4)若mysql估計使用全表掃瞄比索引快,則不使用索引。

(5)對索引列進行運算導致索引列失效。

vii:應該在那些列上加索引?

(1)經常用於搜尋的列,加快搜尋速度。

(2)作為主鍵的列,強制該列的唯一性。

(3)在經常用在連線的列上,這些列主要是外來鍵,可以加快連線速度。

(4)在經常需要根據範圍進行搜尋的列上建立索引,因為索引已經排序,指定的範圍是連續的。

(5)在經常需要排序的列上。

viii:怎麼樣判斷mysql中的乙個select語句是否使用了索引?

可以在select語句前加上explain,比如explain select * from tablename;返回的結果中,若列名為key的那列為null,則沒有使用索引,若不為null,則返回實際使用的索引名。讓select語句強制使用索引的語法:select * from tablename force index(indexname)。

viiii:怎麼樣為select語句指定索引?

select * from student use index(s_d)  where...

注:s_d是索引名稱。

補充:(1)use index

在你查詢語句中表名的後面,新增 use index 來提供你希望 mysq 去參考的索引列

表,就可以讓 mysql 不再考慮其他可用的索引。

eg:select * from mytable use index (mod_time, name) ...

(2)ignore index

如果你只是單純的想讓 mysql 忽略乙個或者多個索引,可以使用 ignore index 。

eg:select * from mytale ignore index (priority) ...

(3)force index

為強制 mysql 使用乙個特定的索引,可在查詢中使用 force index 。

eg:select * from mytable force index (mod_time) ...

vv:在字段上加上索引,查詢的時候,滿足一定條件就可以使用索引:

比如 create table test (id int,name varchar(10));

然後在id上加索引 create index test_index on test(id);

查詢的時候 select * from test where id=?就會走索引,如果 是select * from test where name=?就不走索引。、

vvi:索引是根據你的條件來判斷是否使用索引的

舉個例子:有個d表,有d1(number),d2(varchar2),d3(number) 三個字段,其中d1,d2欄位有作了索引。

select * from d ;--這時候儘管表中有索引,但是不會走索引,會全表掃瞄。

select d1 from d ;--這時候會走d1索引;

select * from d where d1=1,--這時候會走d1索引

select * from d where d2=1,--這時候不會走索引。儘管d2有索引,但是d2是字元型,where條件中是數值型,加上單引就可以走d2索引。

update ,delete和select 是同樣的。

資料庫 關於索引

什麼是索引 索引就像是書的目錄,是與表或檢視關聯的磁碟上結構,可以加快從表或檢視中檢索行的速度。索引中包含由表或檢視中的一列或多列生成的鍵。這些鍵儲存在乙個結構 btree 中,使sql可以快速有效地查詢與鍵值關聯的行。2.為什麼要建立索引,即索引的優點 建立索引的列可以保證行的唯一性,生成唯一的r...

關於資料庫反向索引

反向索引與平時的常用索引不同的是,它將要增加索引的列的資料按位元組顛倒 相當於reverse 存放,比如要存的資料為 12345 12346 12347 12348 反轉為 54321 64321 74321 84321 這樣存的好處是 解決樹的傾斜問題,而且可以解決在大量io操作的情況下,防止硬碟...

關於資料庫的索引

經常需要進行更新操作的屬性 1 表的主鍵 外來鍵必須有索引 2 資料量超過300的表應該有索引 3 經常與其他表進行連線的表,在連線欄位上應該建立索引 4 經常出現在where子句中的字段,特別是大表的字段,應該建立索引 5 索引應該建在選擇性高的字段上 6 索引應該建在小字段上,對於大的文字字段甚...