mysql索引種類(索引種類和建立索引)


一、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字段都是索引

 


免責聲明!

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



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