mysql索引简谈

  mysql索引简谈
 

一、什么是索引
就好比我们在看一本书的时候,有目录的话,我们可以快速定位到想看的地方,而没有目录的话,我们只能一页一页地翻。索引就像目录,有了索引,数据库可以快速查询到目标内容,而不必查找整个数据库表,但是如果没有的话,数据库只能一行一行地遍历数据。

本文使用的案例表:学生表(t_student)

CREATE TABLE `t_student` (
  `st_id` varchar(20) NOT NULL COMMENT '学号',
  `st_name` varchar(20) NOT NULL COMMENT '姓名',
  `st_sex` varchar(2) NOT NULL COMMENT '性别',
  `st_academy` varchar(20) NOT NULL COMMENT '学院',
  `st_major` varchar(20) NOT NULL COMMENT '专业',
  `st_class` varchar(20) NOT NULL COMMENT '班级',
  `st_grade` int(11) NOT NULL COMMENT '年级',
  `st_edu_len` int(11) NOT NULL COMMENT '学制',
  `st_is_at_school` varchar(4) default NULL COMMENT '是否在校',
  PRIMARY KEY  (`st_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


 
二、索引种类
(1)单列索引,包括普通索引(index)、唯一索引(unique inex)、主键索引(primary key),一个单列索引只能包含一列属性

(2)组合索引,一个组合索引包括两个或两个以上的列。

(3)全文索引(fulltext index),检索出多列文本字段上(text类型)包含某些单词的索引

三、索引的创建
(1)单列索引
【1】普通索引,最基本的索引

第一种方式:语法为  create  index  索引名 on  表名(要建立索引的列名)

create index i_st_class on t_student(st_class);


第二种方式:语法为  alter  table  表名  add  index  索引名(要建立索引的列名)

alter table t_student add index i_st_class(st_class);
【2】唯一索引,与普通索引类似,但唯一索引的每一个索引值只对应唯一的数据记录,这一点又与主键索引类似,但唯一索引允许null值

语法为:在创建普通索引的语句中的index前面加上unique即可(假设学生表中的姓名不重复)

create unique index i_st_name on t_student(st_name);

alter table t_student add unique index i_st_name(st_name);


【3】主键索引,在唯一索引的基础上不允许索引列有null值。主键索引一般用在与表中其他列无关或与业务无关的列上,一般是int,自增类型的列上。

不能使用create index语句创建主键索引,只能在建表时创建或alter语句中:

alter table t_student add primary key (st_id);


(2)组合索引
【1】一个组合索引包含多个列,一个组合索引对应的数据记录必须唯一,建立组合索引的语句如下:

create index i_name_major_class on t_student(st_name,st_major,st_class);

alter table t_student add index i_name_major_class(st_name,st_major,st_class);


如果我们建立了以上的组合索引,实际上包含了三个索引,分别是(name)、(name,major)、(name,major,class)

那么我们在查询的时候,如果要使用到组合索引,就必须遵循组合索引的“最左前缀“原则。

【2】什么是最左前缀原则?

用自己的话来说,就是从组合索引的最左列开始,where语句中必须包含此列,且可跳过中间列,到达目标列的匹配规则。

实际上就是上方所说的三种组合(name)、(name,major)、(name,major,class)

【3】哪些语句走组合索引,哪些语句不走呢?

走组合索引的情况:

select * from t_student where st_name='123';
select * from t_student where st_name='123' and st_major='123';
select * from t_student where st_name='123' and st_class='123';
select * from t_student where st_name='123' and st_major='123' and st_class='123';


可以使用explain语句来显示mysql对查询处理的过程

不走组合索引的情况:

select * from t_student where st_major='123';
select * from t_student where st_class='123';
select * from t_student where st_major='123' and st_class='123';


即where条件中如果不带组合索引的最左列的话,肯定不走组合索引。

【注意:保留意见,建议尝试】

四、索引的删除
删除索引的格式为: alter  table  表名  drop  index  索引名  

alter table t_student drop index i_name_major_class;

或为:  drop  index  索引名  on  表名 

drop index i_name_majoe_class on t_student;


五、使用索引的优缺点
优点:
【1】可以通过建立唯一索引或者主键索引,保证数据库表中每一行数据的唯一性
【2】建立索引可以大大提高检索的数据,提高查询性能,以及减少表的检索行数
【3】在分组和排序的子句中进行数据检索,可以减少查询时间中分组和排序时所消耗的时间(数据库中的记录会重新排序)

缺点:
【1】创建索引和维护索引也会耗费时间
【2】每一个索引还会占用一定的物理空间,索引建得多了,数据库文件也会变得庞大起来
【3】当对表的数据进行插入、删除、更新的操作,索引也要动态的维护,这样就会降低表的维护效率

六、使用索引需要注意的地方
【1】.在经常需要搜索的列上建立索引,可以加快查询的速度
【2】在主键列上建立主键索引,可以确保此列数据的唯一性
【3】如果你对st_name字段建立了一个索引,当查询时候的语句是 select * from t_student where st_name like '%123%'  或like '%123',那么这个索引将不会起到作用,而st_name like '123%' 才可以用到索引

【4】不要在列上进行运算,这样会使得mysql索引失效,也会进行全表扫描

七、不需要创建索引的情况
【1】查询中很少使用到的列,不应该创建索引,如果建立了索引,就会降低mysql的性能,也占用了存储空间
【2】当表的插入、删除、修改操作远远多与查询操作时,不应该创建索引,此时会占用数据库的存储空间,降低维护效率,因为索引只能提高查询效率
--------------------- 
原文:https://blog.csdn.net/qq_33591903/article/details/82146995 
 

猜你喜欢

转载自blog.csdn.net/yygg329405/article/details/84146577