【mysql】主鍵、普通索引、唯一索引和全文索引的比較


MYSQL索引用來快速地尋找那些具有特定值的記錄,所有MySQL索引都以B-樹的形式保存。如果沒有索引,執行查詢時MySQL必須從第一個記錄 開始掃描整個表的所有記錄,直至找到符合要求的記錄。表里面的記錄數量越多,這個操作的代價就越高。如果作為搜索條件的列上已經創建了索引,MySQL無 需掃描任何記錄即可迅速得到目標記錄所在的位置。如果表有1000個記錄,通過索引查找記錄至少要比順序掃描記錄快100倍。


 mysql在使用like查詢中,能不能用到索引?在什么地方使用索引呢?

 

在使用like的時候,如果使用‘%%’,會不會用到索引呢?

EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_%';

  

上面的結果是全表掃描,並沒有使用到索引。

只使用右邊一個%的查詢:
EXPLAIN SELECT * FROM `user` WHERE username LIKE 'ptd_%';

這個使用到了索引。


 

只使用左邊一個%的查詢:

EXPLAIN SELECT * FROM `user` WHERE username LIKE '%ptd_';

  

在左邊使用%時也是全表掃描,沒有使用到索引。


綜上,mysql在使用like查詢的時候只有使用后面的%時,才會使用到索引。

 


 

 

總體分析

PRIMARY, INDEX, UNIQUE 這3種是一類

PRIMARY 主鍵。 就是 唯一 且 不能為空。

INDEX 索引,普通的

UNIQUE 唯一索引。 不允許有重復。

FULLTEXT 是全文索引,用於在一篇文章中,檢索文本信息的。

MYSQL的索引類型:PRIMARY, INDEX,UNIQUE,FULLTEXT,SPAIAL 有什么區別?各適用於什么場合?

舉個例子來說,比如你在為某商場做一個會員卡的系統。
這個系統有一個會員表
有下列字段:
會員編號 INT
會員姓名 VARCHAR(10)
會員身份證號碼 VARCHAR(18)
會員電話 VARCHAR(10)
會員住址 VARCHAR(50)
會員備注信息 TEXT

那么這個 會員編號,作為主鍵,使用 PRIMARY
會員姓名 如果要建索引的話,那么就是普通的 INDEX
會員身份證號碼 如果要建索引的話,那么可以選擇 UNIQUE (唯一的,不允許重復)
會員備注信息 , 如果需要建索引的話,可以選擇 FULLTEXT,全文搜索。

不過 FULLTEXT 用於搜索很長一篇文章的時候,效果最好。
用在比較短的文本,如果就一兩行字的,普通的 INDEX 也可以。


創建索引使用說明

普通索引

這是最基本的索引類型,而且它沒有唯一性之類的限制。

創建索引,例如CREATE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD INDEX [索引的名字] (列的列表);
創建表的時候指定索引,例如CREATE TABLE tablename ( [...], INDEX [索引的名字] (列的列表) );


唯一性索引

這種索引和前面的“普通索引”基本相同,但有一個區別:索引列的所有值都只能出現一次,即必須唯一。

 

MYSQL主鍵:

MYSQL主鍵是一種唯一性索引,但它必須指定為“PRIMARY KEY”。

例如“CREATE TABLE tablename ( [...], PRIMARY KEY (列的列表) ); ”。但是,我們也可以通過修改表的方式加入主鍵,例如“ALTER TABLE tablename ADD PRIMARY KEY (列的列表); ”。每個表只能有一個主鍵。

 

全文索引 (適合在進行模糊查詢的時候使用)

MySQL從3.23.23版開始支持全文索引和全文檢索。在MySQL中,全文索引的索引類型為FULLTEXT。全文索引可以在CHAR、VARCHAR或者TEXT類型的列上創建。它可以通過CREATE TABLE命令創建,也可以通過ALTER TABLE或CREATE INDEX命令創建。對於大規模的數據集,通過ALTER TABLE(或者CREATE INDEX)命令創建全文索引要比把記錄插入帶有全文索引的空表更快。

使用方法:(英文示例,中文復雜;后續更新)

語句介紹:WHERE MATCH(COLUMN_NAME) AGAINST('KEY_WORD1,KEY_WORD2' IN BOOLEAN MODE)
索引名稱:FULLTEXT
支持類型:char、varchar、text
以下依次是增、刪、查全文索引示例:
alter table xxf_witkey_article ADD FULLTEXT username(art_title);

DROP INDEX username ON xxf_witkey_article;

SELECT * FROM `xxf_witkey_article` WHERE MATCH(art_title) AGAINST('kkkk');

  

單列索引與多列索引

創建索引,例如CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表);
修改表,例如ALTER TABLE tablename ADD UNIQUE [索引的名字] (列的列表);
創建表的時候指定索引,例如CREATE TABLE tablename ( [...], UNIQUE [索引的名字] (列的列表) 
);

 

 

 


免責聲明!

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



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