目录
前文回顾
系列文章第一、二部分,需要掌握的内容:
略
一、索引
索引有什么用?
约束,加速查找
索引分哪几种?
普通索引(index):加速查找
主键索引(primary key):加速查找,不可重复,不可为空,
唯一索引(unique key):加速查找,不可重复
联合(组合)索引:
联合主键
联合唯一
联合普通索引
如何命中索引,哪些情况无法命中索引?
二、索引的创建
索引的存储方式:hash:单值快,但存储非大小顺序,非实际数据的顺序。
btree 二叉树:范围查找快,数据库一般是btree
有索引查找快,但其他操作稍慢与无索引,原因是更新索引文件。
索引文件单独存放的,占用了硬盘空间。索引 不是越多越方便,用的多的地方创建索引
#主键索引
alter table table_name add primary key (column name)
alter table 表名 drop primary key
--如果主键是自增的,则需要先处理再删除
alter table tablename modify id int ; 【重新定义列类型】
alter table tablename drop primary key;
#普通索引
create index index_name on tablename("XXXX");
drop index index_name on tablename;
#唯一索引
create unique index index_name on tablename('XXXX')
drop unique index index_ame on tablename;
#联合(组合)索引(左前匹配,无左前不匹配)
create unique index index_name on tablename('xx','xxxx');
create index index_name on tablename('xx','xxxx');
alter table table_name add primary key('xxx','xx');
组合索引的匹配效率>索引合并
覆盖索引:并非真正的索引,只是一个索引文件,比如以name为索引的文件(index_name),如果我只查找XXX名字,就可以不 通过实际的数据,而是只查找索引文件。
索引合并:多个单列索引合并。
比如info表有两个索引:name,email;
select * from info where name='xx' and email='xxxx'
三,索引的命中
在实际的使用中有用到索引,则表示命中。为了高效率,尽量命中索引。下面的做法可能无法命中索引导致低效率。
- like '%xxx' - 函数的使用,select * from tb1 where reverse(xxxx)='xxxxx'; 解决建议:先处理好在拿上来做数据 的 操作 - or 且两者中有一个没有创建索引 select * from tbname where id=1 or name='xxxx'; - 类型不一致 select * from tb1 where work_id = 999;如果实际值的类型是字符串,条件也要用字符串'999'; - != 不等于不走索引(主键索引除外) - >大于小于 不走索引(主键索引或者索引是整数类型除外) - order by XXX(XXX非主键或者非索引)