唯一索引和普通索引的區別是什么,什么時候需要建唯一


1. 知識背景
什么是索引?
一個索引是存儲的表中一個特定列的值數據結構(最常見的是B-Tree)。索引是在表的列上創建。所以,要記住的關鍵點是索引包含一個表中列的值,並且這些值存儲在一個數據結構中,索引是一種數據結構,一般是B-TREE 。


2. 知識剖析

MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。
創建索引時,你需要確保該索引是應用在SQL 查詢語句的條件(一般作為 WHERE 子句的條件)。
實際上,索引也是一張表,該表保存了主鍵與索引字段,並指向實體表的記錄。
但過多的使用索引將會造成濫用。因此索引也會有它的缺點:雖然索引大大提高了查詢速度,同時卻會降低更新表的速度。
因為更新表時,MySQL不僅要保存數據,還要保存一下索引文件。


 

普通索引
普通索引(由關鍵字KEY或INDEX定義的索引)的唯一任務是加快對數據的訪問速度。
因此,應該只為那些最經常出現在查詢條件(WHEREcolumn=)或排序條件(ORDERBYcolumn)中的數據列創建索引。
只要有可能,就應該選擇一個數據最整齊、最緊湊的數據列(如一個整數類型的數據列)來創建索引。
mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {column} )


 

唯一索引
它與前面的普通索引類似,不同的就是:索引列的值必須唯一,但允許有空值。如果是組合索引,則列值的組合必須唯一。
在對該列進行增或改時,首先會檢查是否重復,在執行增改操作,否則報出duplica錯誤,拒絕操作。
mysql > ALTER TABLE {table_name} ADD INDEX index_name ( {lolumn} )


3. 常見問題

如果表中沒有所以會發生什么?
一旦我們運行這個查詢,在查找名字AAA的過程中,數據庫不得不對表中的每一行檢索並確定名字是否為AAA。
由於我們想要得到每一個名字為AAA的用戶信息,在查詢到第一個符合條件的行后,不能停止查詢,因為可能還有其他符合條件的行。
所以,必須一行一行的查找直到最后一行這就意味數據庫不得不檢查上千行數據才能找到所以名字為AAA的用戶。這就是所謂的全表掃描。

索引是怎么提升性能的?
因為索引基本上是用來存儲列值的數據結構,這使查找這些列值更加快速。
如果索引使用最常用的數據結構-B-Tree-那么其中的數據是有序的。
假設我們在name一列上創建一個B-Tree索引。這意味着當我們用之前的SQL查找姓名是AAA的用戶時,不需要再掃描全表,而是用索引查找去查找名字為AAA的用戶。
因為索引已經按照按字母順序排序。索引已經排序意味着查詢一個名字會快很多,因為名字少字母為AAA的員工都是排列在一起的。另外重要的一點是,索引同時存儲了表中相應行的指針以獲取其他列的數據。


4. 解決方案
使用索引的原則:        
1、裝載數據后再建立索引。  
2、頻繁搜索的列可以作為索引。    
3、在聯接屬性上建立索引(主外鍵)。    
4、經常排序分組的列。
5、刪除不經常使用的索引。    
6、指定索引塊的參數,如果將來會在表上執行大量的insert操作,建立索引時設定較大的ptcfree。    
7、指定索引所在的表空間,將表和索引放在不同的表空間上可以提高性能。   
8、對大型索引,考慮使用NOLOGGING子句創建大型索引。

不要在下面的列創建索引:
1、僅包含幾個不同值得列。
2、表中僅包含幾條記錄。


 

DEMO

先創建user表
CREATE TABLE user(
id INT NOT NULL,
number INT NOT NULL
);

  

普通索引
ALTER TABLE USER ADD INDEX ID_INDEX(ID);

  

唯一索引

ALTER TABLE USER ADD UNIQUE NUMBER_INDEX(NUMBER);

  

查看索引

SHOW INDEX FROM USER;

  





免責聲明!

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



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