一、mysql索引種類
1、加速查找:
查找普通字段和查找有索引字段,哪個方式查找速度快:根據索引來查字段速度更快
2、創建索引:
為userinfo表email字段創建索引: create index ix_name on userinfo<email>; #創建字段email索引文件,起別名ix_name
為某個字段創建索引會創建額外文件(某種格式存儲),下次查詢這個字段,先去文件中查找數據在表中的位置,拿着這位置去表中定位數據。(類似於查字典)
3.索引種類
hash索引:索引表(無序的排列) 把數據轉換成一個hash值(數值),放在索引表里面,再加上這個數據的存儲地址 查找的時候會根據數據查找到存儲地址。 注意:數據庫的值和索引表存的數值順序是不一樣的。因為這個是無序的排列,所以在數據庫中查找大於/小於多少的數據可能花的時間更長。 缺點:在某個范圍查找數據速度慢 優點:查找單值速度快 btree索引: 二叉樹
#不同的存儲引擎支持的索引類型也不一樣 InnoDB 支持事務,支持行級別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引; MyISAM 不支持事務,支持表級別鎖定,支持 B-tree、Full-text 等索引,不支持 Hash 索引; Memory 不支持事務,支持表級別鎖定,支持 B-tree、Hash 等索引,不支持 Full-text 索引; NDB 支持事務,支持行級別鎖定,支持 Hash 索引,不支持 B-tree、Full-text 等索引; Archive 不支持事務,支持表級別鎖定,不支持 B-tree、Hash、Full-text 等索引;
4.建立索引
1.額外的文件保存特殊的數據結構 2.查詢快,插入更新刪除慢 3.命中索引(使用索引表)
普通索引
普通索引僅有一個功能:加速查詢
創建表+普通索引
create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, index ix_name (name) #ix_name是索引名,name字段建立索引 )
創建索引
create index ix_name on table_name(column_name);
刪除索引
drop index ix_name on table_name;
查看索引
show index from table_name;
唯一索引
唯一索引有兩個功能:加速查詢和唯一約束(可含null)
創建表+唯一索引
create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, unique ix_name (name) )
創建唯一索引
create unique index 索引名 on 表名(列名)
刪除唯一索引
drop unique index 索引名 on 表名
主鍵索引
主鍵有兩個功能:加速查詢 和 唯一約束(不可含null)
創建表+創建主鍵
create table in1( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text, index ix_name (name) ) OR create table in1( nid int not null auto_increment, name varchar(32) not null, email varchar(64) not null, extra text, primary key(ni1), index ix_name (name) )
創建主鍵
alter table 表名 add primary key(列名);
刪除主鍵
alter table 表名 drop primary key;
alter table 表名 modify 列名 int, drop primary key;
聯合索引
聯合索引是將n個列組合成一個索引
其應用場景為:頻繁的同時使用n列來進行查詢,如:where n1 = 'alex' and n2 = 666
創建表
create table in3( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, extra text )
創建聯合索引
create index ix_name_email on in3(name,email); #就是在()中寫多個列名
最左前綴匹配,查詢:
- name and email -- 使用索引
- name -- 使用索引
- email -- 不使用索引 (因為email字段在右邊)
注意:對於同時搜索n個條件時,組合索引的性能好於索引合並。
5.不真實存在的索引
名詞:
覆蓋索引:在索引文件中直接獲取數據
索引合並:使用多個單列索引搜索
索引合並示例:
select * from tb1 where name = 'alex' or nid in (11,22,33); #這里name,nid字段都是索引