索引
即特定的MySQL字段進(jìn)行一些特定的算法排序,幫助MySQL高效獲取數(shù)據(jù)的數(shù)據(jù)結(jié)構(gòu)
MySQL數(shù)據(jù)庫支持多種索引類型罐寨,如BTree索引测垛,哈希索引萝究,全文索引等
HASH
通過建立特征值,然后根據(jù)特征值來快速查找
速度更快唇辨,但只能用于 =廊酣、<=>、IN操作符;優(yōu)化器不能用于order by;任何查找操作必須是索引的完整列
BTree
列記錄都是按照順序排列的助泽,可以優(yōu)化用于比較或者范圍查找操作(=, >, >=, <, <=, between, in)啰扛,以及用于group by, order by嚎京,而且對于字符串類型的索引嗡贺,最左前綴字符串也可以充分利用索引,如like ‘a(chǎn)dmin%’會(huì)解釋成 ‘a(chǎn)dmin’ <= key_col < ‘a(chǎn)dmil’
索引類型
index 普通索引
- MySQL的基本索引鞍帝,無限制
- 對于字符串類型诫睬,可以指定索引前綴長度
unique 唯一索引
唯一值,可以為NULL
** primary key 主鍵索引**
特殊的唯一索引帕涌,不允許有空值 - 一表只能有一個(gè)主鍵
fulltext index 全文索引「作用不大」
全文索引,針對值中的某個(gè)單詞,比如一篇文章中的某個(gè)詞
索引操作
索引創(chuàng)建
# 表創(chuàng)建完之后創(chuàng)建
alter table table_name add index index_name(column, [column1,...])
alter table table_name add unique index_name(column)
# 表創(chuàng)建完之后創(chuàng)建
create table table_name (
......
primary key (id),
unique key index_name (column),
key index_name (column)
);
索引刪除
1) drop index index_name on table_name
2) alter table table_name drop index index_name
索引查看
show index from table_name \G;
索引技巧
1 對 where, on, group by, order by 中出現(xiàn)的列使用索引
2 對較小數(shù)據(jù)列使用索引摄凡,可使索引文件更小,同時(shí)內(nèi)存中也可以裝載更多的索引鍵
3 較長字符串使用前綴索引
4 不建立過多索引, 除了增加額外的磁盤空間外,對于DML操作的速度影響很大,因?yàn)槠涿吭鰟h改一次就得更新索引
5 使用組合索引,注意順序
6 維度高的列創(chuàng)建索引
數(shù)據(jù)列中不重復(fù)值出現(xiàn)的個(gè)數(shù)越大, 維度就越高;要為維度高的列創(chuàng)建索引,如性別和年齡,那年齡的維度高于性別蚓曼,性別不適合創(chuàng)建索引亲澡,其維度過低
不走索引的SQL
# 以下SQL不走索引
select * from users where name like '%tom'; # like 'tom%' 走索引
select * from users where age + 1 = 25; # 索引列參與運(yùn)算
select * from users where left(`create_time`,4) < 1990; # 使用函數(shù),同上
select * from users where aa = 1; # 如果aa定義為字符串纫版,則不走索引
# 當(dāng)name age email都建立了索引床绪,才走索引「查詢中避免使用or」
select * from users where name='xx' or age = 22 or email='email@gmail.com';
索引弊端
雖然索引提高了查詢速度,當(dāng)時(shí)卻增加額外的磁盤空間,但是會(huì)降低DML操作的速度,因?yàn)槠涿吭鰟h改一次就得更新索引
PS: 一般情況下其弊, 查詢操作遠(yuǎn)大與DML操作
在大數(shù)據(jù)導(dǎo)入時(shí),可以先刪除索引,再批量插入數(shù)據(jù),最后再添加索引