數據庫索引和主鍵


1、什么是索引?

面試時候,常常被問到自己熟知的Mysql優化技巧,索引一定會被提及。那么,什么是索引呢?索引是一種加快海量數據查詢的技術。索引就像是小時候的新華字典,有了索引,你可以快速地找到自己想找的東西。MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。

索引分單列索引和組合索引。單列索引,即一個索引只包含單個列,一個表可以有多個單列索引,但這不是組合索引。組合索引,即一個索引包含多個列。

創建索引時,你需要確保該索引是應用在 SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。

實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。過多的使用索引將會造成濫用。

因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度,如對表進行INSERT、UPDATE和DELETE。因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。

建立索引會占用磁盤空間的索引文件。

2、索引的優缺點

1)優點
A.加快數據檢索速度和表與表之間的連接;
B.可以顯著減少查詢中分組和排序的時間(使用分組和排序子句進行數據檢索時)。

2)缺點
A.占物理空間。
B.需要動態維護,降低數據維護速度(update、delete、insert)。

3、索引的分類

一般索引:這是最基本的索引,它沒有任何限制。值可以重復,可以為空。

唯一索引:它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。

聚集索引類似於電話簿,后者按姓氏排列數據。由於聚集索引規定數據在表中的物理存儲順序,因此一個表只能包含一個聚集索引。

但該索引可以包含多個列(組合索引),就像電話簿按姓氏和名字進行組織一樣。

如果在表中未創建聚集索引,則無法保證這些行具有任何特定的順序。聚集索引..就像我們新華字典中的按拼音排序..即你查.."愛"字..可以在前面看到"
癌"字...但不會看到"受"字..而非聚集索引..就是新華字典中的按部首..筆划排序...

聚集索引相當於我們書本上前面的目錄的一樣,它可以方便快速的找到你想找的內容,而非聚集索引就相當於書最后幾頁的解釋,它是對書中某個語句或者是生詞的解釋
,就像我們上學時候的地理說一樣,書后面都有各種地理名稱的英文解釋;

《數據庫原理》里面的解釋:聚集索引的順序就是數據的物理存儲順序,而非聚集索
引的順序和數據物理排列無關。因為數據在物理存放時只能有一種排列方式,所以一
個表只能有一個聚集索引。

主要分為聚集索引和非聚集索引兩類。

什么是聚集索引?
正文內容本身是一種按照一定規則排列的目錄稱為“聚集索引”,就如新華字典的正文本身。因為數據只能按照一種規則排序,所以一張表至多有一個聚集索引,但可以有多個非聚集索引。

非聚集索引最常見的就是聯合索引,那什么是聯合索引呢?
比如 INDEX idx_test(col_a,col_b),這種包含多個字段的索引就被稱為“聯合索引”。

何時使用聚集索引或非聚集索引,參照:

 
 
聚集索引或非聚集索引.png

在MySQL數據庫的 InnoDB存儲引擎中,主鍵索引就是聚集索引,所有數據都會按照主鍵索引進行組織;而在 MyISAM存儲引擎中,就沒有聚集索引了,因為MyISAM存儲引擎中的數據不是按索引順序進行存儲的。

4、什么是主鍵?

表中經常有一個列或列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵.(默認為聚集索引)聚集索引確定表中數據的物理順序。

主鍵:唯一標識記錄(常見的什么什么ID),不允許重復,不允許為空。
主鍵默認建立唯一索引,所以創建表時,不能在同一個字段上建立兩個索引,如:deal_id已經是主鍵,不能再次執行:
create index table_fei on tmp_table(deal_id) 會報錯!

 
 
比對.png
  1. 主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。

  2. 一個表中可以有多個唯一性索引,但只能有一個主鍵(圖中多個主鍵指復合主鍵)

  3. 主鍵列不允許空值,而唯一性索引列允許空值。

  4. 索引可以提高查詢的速度。

主鍵和索引都是鍵,不過主鍵是邏輯鍵,索引是物理鍵(也是表,存在物理磁盤),意思就是主鍵不實際存在,而索引實際存在在數據庫中。

DROP INDEX [indexName] ON mytable; //刪除索引的語法
SHOW INDEX FROM table_name; //顯示索引信息

 索引說明:https://www.runoob.com/mysql/mysql-index.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM