首页 > 数据库 >mysql索引简谈

mysql索引简谈

时间:2023-01-04 12:35:02浏览次数:64  
标签:index name 简谈 st 索引 student mysql class

                                             mysql索引简谈

 

一、什么是索引

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


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

  1. CREATE TABLE `t_student` (
  2. `st_id` varchar(20) NOT NULL COMMENT '学号',
  3. `st_name` varchar(20) NOT NULL COMMENT '姓名',
  4. `st_sex` varchar(2) NOT NULL COMMENT '性别',
  5. `st_academy` varchar(20) NOT NULL COMMENT '学院',
  6. `st_major` varchar(20) NOT NULL COMMENT '专业',
  7. `st_class` varchar(20) NOT NULL COMMENT '班级',
  8. `st_grade` int(11) NOT NULL COMMENT '年级',
  9. `st_edu_len` int(11) NOT NULL COMMENT '学制',
  10. `st_is_at_school` varchar(4) default NULL COMMENT '是否在校',
  11. PRIMARY KEY (`st_id`)
  12. ) 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】哪些语句走组合索引,哪些语句不走呢?

走组合索引的情况:

  1. select * from t_student where st_name='123';
  2. select * from t_student where st_name='123' and st_major='123';
  3. select * from t_student where st_name='123' and st_class='123';
  4. select * from t_student where st_name='123' and st_major='123' and st_class='123';

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

不走组合索引的情况:

  1. select * from t_student where st_major='123';
  2. select * from t_student where st_class='123';
  3. 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】当表的插入、删除、修改操作远远多与查询操作时,不应该创建索引,此时会占用数据库的存储空间,降低维护效率,因为索引只能提高查询效率

 

标签:index,name,简谈,st,索引,student,mysql,class
From: https://www.cnblogs.com/LoveShare/p/17024501.html

相关文章

  • 【数据库】浅析Innodb的聚集索引与非聚集索引
    Mysql存储引擎之一的Innodb的索引,可以分为聚集索引与非聚集索引,这两种索引都是使用B+树组织的。本文不讲解什么是索引,对索引不了解的同学可以先移步到我的另外一篇文章【......
  • 【MySQL】谈谈锁的类型
    前言MySQL中的锁分为表锁以及行锁,从字面意思就可以得知,表锁是对一整张表进行加锁,而行锁是针对于特定的行。在Server层面,提供了表锁的实现,而行锁则由存储引擎实现。Innodb......
  • Ubuntu 安装MySQL 并 重置root密码
    注:如果不是root用户,命令前需加上sudo1、安装MySQLapt-getinstallmysql-server如果报错则更新源 apt-getupdate  2、安装好MySQL后,启用MySQL servicemysql......
  • 使用ansible-playbook自动化安装MySQL主从
    【使用自动化安装MySQL主从架构】说明:使用ansible-playbook 自动化安装MySQL主从+ mysqld-exporter的采集数据+ xtrabackup备份【剧本说明】以下文件在roles目录......
  • 通俗易懂的MySQL事务及MVCC原理,我先收藏了!
    一、事务简介与四大特性事务指的是一组命令操作,在执行的过程中,要么全部成功,要么全部失败。由引擎层支持事务,MyISAM就不支持事务,而InnoDB是支持事务的。事务具有以下四......
  • 使用pymysql连接数据库,插入报错:You have an error in your SQL syntax; check the manu
    问题YouhaveanerrorinyourSQLsyntax;checkthemanualthatcorrespondstoyourMySQLserverversionfortherightsyntaxtousenear"xx"==...问题描述......
  • [MYSQL] 自动排序函数
    rank()ovre(业务逻辑)并列排序,会跳过重复序号dense_rank()over(业务逻辑)并列排序,不会跳过重复序号dense_rank()over排名是密集连续的row_number()顺序排序,不......
  • mysql基于binlog的恢复
    [root@stag-8-460104]#mysql--socket=/tmp/mysql_sandbox20034.sock-umsandbox-p'msandbox'mysql:[Warning]Usingapasswordonthecommandlineinterfacecan......
  • Mysql的时间计算
    1、timestampdiff()函数TIMESTAMPDIFF(unit,datetime_expr1,datetime_expr2)作用:计算两个日期、时间表达式(datetime_expr1和datetime_expr1)之间相差的天数、周......
  • Mysql ProxySQL
    rpm-ivhproxysql-2.4.1-1-centos7.x86_64.rpm版本:proxysql--version启动:serviceproxysqlstart暂停:serviceproxysqlstop重启:serviceproxysqlrestart状态:service......