数据库SQL索引的作用以及什么时候索引会失效

(一)数据库中索引的介绍以及使用

1.什么是索引

索引是对数据库表中的一列或者多列的值进行排序的一种数据结构,如果把数据库中的表比作一本书,索引就是这本书的目录,通过目录可以快速查找到书中指定内容的位置

索引也是一张表,该表中存储着索引的值和这个值的数据所在行的物理地址,使用索引后可以不用扫描全表来定位某行的数据,而是通过索引表来找到该行数据对应的物理地址

2.索引的优缺点

优点:

建立索引的列可以保证行的唯一性,生成唯一的rowId

索引可以有效缩短数据的检索时间,减少I/O次数

索引可以加快表与表之间的连接

为用来排序和分组的字段建立索引可以加快分组和排序

缺点:

创建索引和维护索引需要时间成本,这个成本随着数据量的增大而加大

创建索引和维护索引需要空间成本,每一条索引都需要占据数据库的物理存储空间,数据量越大,占用空间也越大

会降低表的增删改的效率,因为每次增删改,索引需要进行动态维护

3.Mysql的索引有哪些

从逻辑角度

1).普通索引:普通索引是最基本的索引,它没有任何限制,允许在定义索引的列中插入重复值和空值

直接创建:

create index index_name on table_name (column(length));

修改表结构添加索引:

alter table table_name add index index_name on(column(length));

创建表的时候创建索引:

create table table_name(
.....
....
....
index index_name(column(length))
)

删除索引:

drop index index_name on table;

2).唯一索引:索引列的值必须唯一,允许有空值,如果是组合索引,列值的组合必须唯一

直接创建:

create unique index index_name on table_name (column(length));

修改表结构添加索引:

alter table table_name add unique index index_name on(column(length));

创建表的时候创建索引:

create table table_name(
.....
....
....
unique index index_name(column(length))
)

3).主键索引:主键索引是一种特殊的唯一索引,一个表只能有一个主键,不允许有空值,一般是在创建表的时候指定主键,主键默认就是主键索引

create table table_name(
........
......
.....
primary key(column)
)

4).组合索引:多个字段上创建的索引,只有在查询条件中使用了创建索引时的第一个字段,索引才会被使用

alter table table_name add index index_name(column,column,column..);

5).全文索引:索引类型为FULLTEXT,允许有重复值和空值,可以在char、varchar、text类型的列上创建,Mysql中MyISAM和InnoDB存储引擎都支持。主要用来查找文本中的关键字,而不是直接与索引中的值比较,它更像是一个搜索引擎,全文索引需要配合match against操作使用,而不是一般的where语句加like

6).空间索引:空间索引是对空间数据类型的字段建立的索引,Mysql中的空间索引类型有4种,GEOMETRY、POINT、LINESTRING、POLYGON,创建空间索引的列,必须将其声明为not null,Mysql中只有MyISAM存储引擎支持创建空间索引

(二)数据库中索引什么时候会消失?

1.对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引

alter table student add index my_index(name, age)   // name左边的列, age 右边的列                                                              

select * from student where name = 'aaa'     // 会用到索引

select * from student where age = 18          //  不会使用索引

2.对于使用 like 查询, 查询如果是 ‘%aaa’ 不会使用索引,而 ‘aaa%’ 会使用到索引。

select * from student where name like 'aaa%' // 会用到索引

select * from student where name like '%aaa'        或者   '_aaa'   //  不会使用索引

3.如果条件中有 or, 有条件没有使用索引,即使其中有条件带索引也不会使用,换言之, 就是要求使用的所有字段,都必须单独使用时能使用索引。所以尽量使用in,这个是会使用索引的。

4.如果列类型是字符串,那么一定要在条件中使用引号引用起来,否则不使用索引。

select * from  table where name='zhangsan';  #使用索引
select * from  table where name= zhangsan;   #没有使用索引

5.如果mysql认为全表扫面要比使用索引快,则不使用索引。

如:表里只有一条数据。

更多的亲测可以参考https://blog.csdn.net/qq_42166308/article/details/103326386

你可能感兴趣的:(数据库SQL索引的作用以及什么时候索引会失效)