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 [索引的名字] (列的列表)
);