该怎么使用数据库索引

该怎么使用数据库索引。> 联合索引中,最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配 ```sql

索引的作用

索引什么时候会失效

联合索引中,最左优先,以最左边的为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between、like)就会停止匹配

索引列用函数或表达式

1
select * from test where  num  +  1 = 5

is not null

1
select * from user where user_id is not null;

or表达式

or表达式作为条件,有一个列没有索引,那么其它列的索引将不起作用

1
select * from user where user_id = 700 or user_name = "Tom";

列与列对比

1
select * from test where id = c_id;

数据类型的转换

1
2
create index `idx_user_name` ON user(user_name)
select * from user where user_name::numeric=123;

<>、NOT、in、not exists

1
2
3
4
select * from user where user_id<>500;
select * from user where user_id in (1,2,3,4,5);
select * from user where user_id not in (6,7,8,9,0);
select * from user where user_id exists (select 1 from user_record where user_record.user_id = user.user_id);

like查询是以%开头

1
select * from user where name like '%'

联合索引

联合索引(包含多个字段的普通索引)满足最左匹配原则,最左优先,以最左边的为起点任何连续的索引都能匹配上,若不是从最左的索引字段开始,则失效。另外,遇到范围查询(>、<、between、like),后面的约束也无 索引效果。

索引怎么用

使用索引的情况

  • 主键字段;
  • 经常需要搜索的列,比如where条件经常用到的字段;
  • 其他表的外键字段,作为连接表的条件字段,可以有效加快连表查询速度;
  • 查询中作为排序、统计或者是分组的字段;

不适用索引的情况

  • 频繁更新的字段不适合创建索引,因为每次更新不单单是更新记录,还会更新索引,保存索引文件
  • where条件里用不到的字段,不创建索引;
  • 表记录太少,不需要创建索引;
  • 对于那些定义为text,image类型的列不应该增加索引。这是因为,这些列的数据量要么相当大,要么取值很少,不利于使用索引;
  • 数据重复且分布平均的字段,因此为经常查询的和经常排序的字段建立索引。注意某些数据包含大量重复数据,这种字段建立索引就没有太大的效果,例如性别字段,只有男女,不适合建立索引。

注意

Licensed under CC BY-NC-SA 4.0
Gear(夕照)的博客。记录开发、生活,以及一些不足为道的思考……