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),這種包含多個字段的索引就被稱為“聯合索引”。
何時使用聚集索引或非聚集索引,參照:

在MySQL數據庫的 InnoDB存儲引擎中,主鍵索引就是聚集索引,所有數據都會按照主鍵索引進行組織;而在 MyISAM存儲引擎中,就沒有聚集索引了,因為MyISAM存儲引擎中的數據不是按索引順序進行存儲的。
4、什么是主鍵?
表中經常有一個列或列的組合,其值能唯一地標識表中的每一行。這樣的一列或多列稱為表的主鍵.(默認為聚集索引)聚集索引確定表中數據的物理順序。
主鍵:唯一標識記錄(常見的什么什么ID),不允許重復,不允許為空。
主鍵默認建立唯一索引,所以創建表時,不能在同一個字段上建立兩個索引,如:deal_id已經是主鍵,不能再次執行:
create index table_fei on tmp_table(deal_id) 會報錯!

-
主鍵一定是唯一性索引,唯一性索引並不一定就是主鍵。
-
一個表中可以有多個唯一性索引,但只能有一個主鍵(圖中多個主鍵指復合主鍵)
-
主鍵列不允許空值,而唯一性索引列允許空值。
-
索引可以提高查詢的速度。
主鍵和索引都是鍵,不過主鍵是邏輯鍵,索引是物理鍵(也是表,存在物理磁盤),意思就是主鍵不實際存在,而索引實際存在在數據庫中。
DROP INDEX [indexName] ON mytable; //刪除索引的語法
SHOW INDEX FROM table_name; //顯示索引信息
索引說明:https://www.runoob.com/mysql/mysql-index.html