什麼是索引?MySQL常見的幾種索引類型和原理

來源:素文宅博客

地址:https://blog.yoodb.com/yoodb/article/detail/1536

在關係數據庫中,索引是一種單獨的、物理的對數據庫表中一列或多列的值進行排序的一種存儲結構,它是某個表中一列或若干列值的集合和相應的指向表中物理標識這些值的數據頁的邏輯指針清單。更通俗的說,數據庫索引的作用相當於圖書的目錄,可以根據目錄中的頁碼快速找到所需的內容。

u=753998275,986147003&fm=26&gp=0.jpg

MySQL索引的建立對於MySQL的高效運行是很重要的,索引可以大大提高MySQL的檢索速度。雖然索引很大程度的提高了查詢速度,但是卻會降低更新表的速度,如對錶進行INSERT、UPDATE和DELETE。因爲更新表時,MySQL不僅要保存數據,還要保存索引文件,並且建立索引會佔用磁盤空間的索引文件。

 

常見的索引類型

MySQL常見有以下幾種索引類型:FULLTEXTNORMALSPATIDXUNIQUE

 

1、FULLTEXT即爲全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不過目前只有 CHAR、VARCHAR ,TEXT 列上可以創建全文索引。全文索引並不是和MyISAM一起誕生的,它的出現是爲了解決WHERE name LIKE “%word%"這類針對文本的模糊查詢效率較低的問題。

2、NORMAL即爲普通索引,使用字段關鍵字建立的索引,主要是提高查詢速度。

3、SPATIDX即爲空間索引,目前只有MyISAM引擎支持並且空間類型的字段不能爲空。

4、UNIQUE即爲唯一索引,字段數據是唯一的,數據內容裏面能否爲 null,在一張表裏面,是可以添加多個唯一索引。 

 

在比較老的版本中,只有MyISAM引擎支持全文索引,在INNODB5.6後引擎也支持全文索引,在MySQL中全文索引不支持中文。我們一般使用SPATIDX集合。CORESEEK來實現中文的全文索引。

 

索引的分類  

MyISAMInnoDB存儲引擎:只支持BTREE索引, 也就是說默認使用BTREE,不能夠更換MEMORY/HEAP存儲引擎:支持HASHBTREE索引。索引我們分爲四類:單列索引(普通索引,唯一索引,主鍵索引)、組合索引、全文索引、空間索引。

 

單列索引:一個索引只包含單個列,但一個表中可以有多個單列索引。 這裏不要搞混淆了。

普通索引:MySQL中基本索引類型,沒有什麼限制,允許在定義索引的列中插入重複值和空值,純粹爲了查詢數據更快一點。

唯一索引:索引列中的值必須是唯一的,但是允許爲空值,

主鍵索引:是一種特殊的唯一索引,不允許有空值。

組合索引:在表中的多個字段組合上創建的索引,只有在查詢條件中使用了這些字段的左邊字段時,索引纔會被使用,使用組合索引時遵循最左前綴集合。這個如果還不明白,等後面舉例講解時在細說

全文索引:只有在MyISAM引擎上才能使用,只能在CHAR,VARCHAR,TEXT類型字段上使用全文索引,介紹了要求,說說什麼是全文索引,就是在一堆文字中,通過其中的某個關鍵字等,就能找到該字段所屬的記錄行,比如有"你是個靚仔,靚女 ..." 通過靚仔,可能就可以找到該條記錄。這裏說的是可能,因爲全文索引的使用涉及了很多細節,我們只需要知道這個大概意思,如果感興趣進一步深入使用它,那麼看下面測試該索引時,會給出一個博文,供大家參考。

空間索引:空間索引是對空間數據類型的字段建立的索引,MySQL中的空間數據類型有四種,GEOMETRYPOINTLINESTRINGPOLYGON。在創建空間索引時,使用SPATIAL關鍵字。要求,引擎爲MyISAM,創建空間索引的列,必須將其聲明爲NOT NULL

注意:索引是在存儲引擎中實現的,也就是說不同的存儲引擎,會使用不同的索引。

 

操作索引

1. 創建索引

--創建普通索引

CREATE INDEX index_name ON table_name(col_name);

--創建唯一索引

CREATE UNIQUE INDEX index_name ON table_name(col_name);

--創建普通組合索引

CREATE INDEX index_name ON table_name(col_name_1,col_name_2);

--創建唯一組合索引

CREATE UNIQUE INDEX index_name ON table_name(col_name_1,col_name_2);

 

2. 通過修改表結構創建索引

ALTER TABLE table_name ADD INDEX index_name(col_name);

 

3. 創建表時直接指定索引

CREATE TABLE table_name (
    ID INT NOT NULL,col_name VARCHAR (16) NOT NULL,INDEX index_name (col_name)
);

 

4. 刪除索引

--直接刪除索引
DROP INDEX index_name ON table_name;
--修改表結構刪除索引
ALTER TABLE table_name DROP INDEX index_name;

 

5. 其它相關命令

--查看錶結構
desc table_name;
--查看生成表的SQL
show create table table_name;
--查看索引
show index from  table_name;
--查看執行時間
set profiling = 1;
SQL...
show profiles;

 

MySQL的慢查詢日誌是MySQL提供的一種日誌記錄,它用來記錄在MySQL中響應時間超過閥值的語句,具體指運行時間超過long_query_time值的SQL,則會被記錄到慢查詢日誌中。long_query_time的默認值爲10S。

explain + 查詢SQL - 用於顯示SQL執行信息參數,根據參考信息可以進行SQL優化,如下SQL語句:

explain select * from table_name;

 

查看慢日誌參數:

--查詢配置命令
show variables like '%query%';
--當前配置參數
binlog_rows_query_log_events    OFF
ft_query_expansion_limit    20
have_query_cache    YES
--時間限制,超過此時間,則記錄
long_query_time    10.000000
query_alloc_block_size    8192
query_cache_limit    1048576
query_cache_min_res_unit    4096
query_cache_size    1048576
query_cache_type    OFF
query_cache_wlock_invalidate    OFF
query_prealloc_size    8192
--是否開啓慢日誌記錄
slow_query_log    OFF
--日誌文件
slow_query_log_file    /usr/local/mysql/logs/yoodb-log.log

 

查看MySQL慢日誌命令如下:

mysqldumpslow -s at -a  /usr/local/mysql/yoodb-slow.log

參數說明:

-s是order的順序;al 平均鎖定時間;ar 平均返回記錄時間;at 平均查詢時間(默認);c 計數;l 鎖定時間;r 返回記錄;t 查詢時間;-t是top n的意思,即爲返回前面多少條的數據;-g後邊可以寫一個正則匹配模式,大小寫不敏感的。

 

爲了使索引的效率更高,在創建索引時,必須考慮在哪些字段上創建索引和創建什麼類型的索引,建議如下:

1)選擇唯一性索引

2)爲經常需要排序、分組和聯合操作的字段建立索引

3)爲常作爲查詢條件的字段建立索引

4)限制索引的數目

5)儘量使用數據量少的索引

6)儘量使用前綴來索引

7)刪除不再使用或者很少使用的索引

 

索引使用注意事項

1)只要列中包含NULL值將不會被包含在索引中,組合索引只要有一列含有NULL值,那麼這一列對於組合索引就是無效的,所以我們在設計數據庫的時候最好不要讓字段的默認值爲NULL;

2)使用短索引

如果可能應該給索引指定一個長度,例如:一個VARCHAR(255)的列,但真實儲存的數據只有20位的話,在創建索引時應指定索引的長度爲20,而不是默認不寫。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章