目录
索引的介绍
数据库中专门用于帮助用户快速查找数据的一种数据结构. 类似于字典中的目录,查找字典内容时
可以根据目录查找到数据的存放位置,然后获取
索引的作用
约束和加速查找
常见的索引有哪几种
- 普通索引
- 唯一索引
- 主键索引
- 联合索引 (多列)
-联合主键索引
-联合唯一索引
-联合普通索引
无索引和有索引的区别是什么?
无索引的话 从前往后一条一条查询
有索引 : 创建索引的本质, 就是创建额外的文件,(某种格式存储,查询的时候,先去格外的文件找,定好位置,然后再去原始表中直接查询,但是创建索引越多,会对硬盘也是有损耗)
那建立索引的目的是什么?
1,额外的文件保存特殊的数据结构
2,查询快,但是插入更新删除依然慢
3,创建索引后,必须命中索引才能有效
hash索引和BTree索引
1,hash类型的索引 : 查询单条快, 范围查询慢
2,btree类型的索引 : b+树,层数越多,数据量指数级增长
普通索引
作用: 仅有一个加速查找
create table userinfo( nid int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, index ix_name(name) );
普通索引:
create index 索引的名字 on 表名(列名)
删除索引:
drop index 索引的名字 on 表名
查看索引:
show index from 表名
唯一索引
唯一索引有两个功能:加速查找和唯一约束
create table userinfo( id int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, unique index ix_name(name) );
唯一索引:
create unique index 索引名 on 表名
删除唯一索引:
drop index 索引名 on 表名;
主键索引
主键索引有两个功能 : 加速查找和唯一约束
create table userinfo( id int not null auto_increment primary key, name varchar(32) not null, email varchar(64) not null, unique index ix_name(name) ) or create table userinfo( id int not null auto_increment, name varchar(32) not null, email varchar(64) not null, primary key(nid), unique index ix_name(name) ) 创建表+主键索引
主键索引:
alter table 表名 add primary key(列名);
删除主键索引:
alter table 表名 drop primary key;
alter table 表名 modify 列名 int,drop primary key;
组合索引
组合索引是将n个列组合成一个索引
联合普通索引:
create index 索引名 on 表名(列名1,列名2);
索引名词
覆盖索引: 在索引文件中直接获取数据
例: select name from userinfo where name ="afan1000000";
索引合并: 把多个单列索引合并成使用
例: select * from userinfo where name="afan1000000" and id="1313131";
什么是最左前缀呢?
最左前缀匹配: create index ix_name_email on userinfo(name,email); select * from userinfo where name = 'alex'; select * from userinfo where name = 'alex' and email='alex@oldBody'; select * from userinfo where email='alex@oldBody'; 如果使用组合索引如上,name和email组合索引之后,查询 (1)name和email ---使用索引 (2)name ---使用索引 (3)email ---不适用索引 对于同时搜索n个条件时,组合索引的性能好于多个单列索引
******组合索引的性能>索引合并的性能*********
索引的注意事项
1.避免使用select *
2. count(1) 或 count(列) 代替 count(*)
3.创建表时尽量使用char代替varchar
4.表的字段顺序固定长度的字段优先
5.组合索引代替多个单列索引(经常使用多个条件查询时)
6.尽量使用短索引(create index ix_title on tb(title(16)); reshuffle的数据类型 text类型
7.使用连接(join) 来代替子查询
8.连表时注意条件类型需一致
9.索引散列(重复少) 不适用于建索引,例如:性别不合适