各种索引

索引分类

1
2
3
4
5
6
7
8
create table s1(
id int ,#可以在这加primary key
name char(20),
age int,
email varchar(30)
#primary key(id) #也可以在这加
index(id) #可以这样加
);

普通索引

index :加速查找

1
2
3
4
5
-在创建表后在创建
create index name on s1(name); #添加普通索引


drop index name on s1; #删除普通索引

唯一索引

​ 主键索引:primary key :加速查找+约束(不为空且唯一)
​ 唯一索引:unique:加速查找+约束 (唯一)

1
2
3
4
create unique age on s1(age);添加唯一索引
alter table s1 add primary key(id); #添加住建索引,也就是给id字段增加一个主键约束

alter table s1 drop primary key; #删除主键(因为它添加的时候是按照alter来增加的,那么我们也用alter来删)

联合索引

​ -primary key(id,name):联合主键索引
​ -unique(id,name):联合唯一索引
​ -index(id,name):联合普通索引

1
create index name on s1(id,name); #添加普通联合索引

全文索引

fulltext :用于搜索很长一篇文章的时候,效果最好。

空间索引

spatial :了解就好,几乎不用

使用索引

覆盖索引

1
2
3
4
5
select * from s1 where id=123;
该sql命中了索引,但未覆盖索引。

select id from s1 where id=123;
这条就是覆盖索引了,命中索引,且从索引的数据结构直接就取到了id在硬盘的地址,速度很快

联合索引

1
2
create index ne on s1(name,email);#组合索引
select * from s1 where name='egon' and email='adf';

最左前缀匹配

1
2
3
4
5
create index ne on s1(name,email);#组合索引
#必须按照从左到右的顺序匹配
select * from s1 where name='egon'; #可以
select * from s1 where name='egon' and email='asdf'; #可以
select * from s1 where email='alex@oldboy.com'; #不可以

会一直向右匹配直到遇到范围查询(>、<、between、like)就停止匹配

1
2
3
比如a = 1 and b = 2 and c > 3 and d = 4 
如果建立(a,b,c,d)顺序的索引,d是用不到索引的,
如果建立(a,b,d,c)的索引则都可以用到,a,b,d的顺序可以任意调整

使用like 'x%'会走索引

尽量选择区分度高的列作为索引,区分度的公式是count(distinct col)/count(*),
表示字段不重复的比例,比例越大我们扫描的记录数越少,唯一键的区分度是1,而一些状态、
性别字段可能在大数据面前区分度就是0,那可能有人会问,这个比例有什么经验值吗?使用场景不同,
这个值也很难确定,一般需要join的字段我们都要求是0.1以上,即平均1条扫描10条记录

索引列不能参与计算,保持列“干净”,比如from_unixtime(create_time) = ’2014-05-29’

所以语句应该写成create_time = unix_timestamp(’2014-05-29’);

点击打赏
文章目录
  1. 1. 索引分类
    1. 1.1. 普通索引
    2. 1.2. 唯一索引
    3. 1.3. 联合索引
    4. 1.4. 全文索引
    5. 1.5. 空间索引
  2. 2. 使用索引
    1. 2.1. 覆盖索引
    2. 2.2. 联合索引
    3. 2.3. 最左前缀匹配
载入天数...载入时分秒... ,