暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

mysql索引,if/else,循环,数据备份还原,事务,视图基本使用

JAVA不归路 2021-07-16
553

索引

MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护者满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。


索引优势劣势
优势
1)类似于书籍的目录索引,提高数据检索的效率,降低数据库的IO成本。
2)通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。
劣势
1)实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。
2)虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE、DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息。

索引的类型

唯一索引:索引列的所有值都只能出现一次,即必须唯一,值可以为空。

主键索引:主键是一种唯一性索引,但它必须指定为PRIMARY KEY,每个表只能有一个主键。

组合索引:多列值组成一个索引,专门用于组合搜索,其效率大于索引合并

全文索引:全文索引的索引类型为FULLTEXT。全文索引可以在varchar、char、text类型的列上创建。可以通过ALTER TABLE或CREATE INDEX命令创建。对于大规模的数据集,通过ALTER TABLE(或者CREATE INDEX)命令创建全文索引要比把记录插入带有全文索引的空表更快。MyISAM支持全文索引,InnoDB在mysql5.6之后支持了全文索引。

索引语法

create [unique|fulltext|spatial] index index_name
[using index_type]
on tbl_name(index_col_name,...)

index_col_name:column_name[(length)][ASC|DESC]

[unique|fulltext|spatial]:索引类型,可以不指定
index_name:索引名称
[using index_type]:指定索引使用哪个类型,不指定默认使用的是B+树
tbl_name(index_col_name,...):对哪张表的哪些字段建立索引,tbl_name为表名,index_col_name为字段名

建表

create table stu(
id int primary key auto_increment,
sname varchar(10),
age int
)
##mysql数据库主键自带主键索引

基本语法

创建一个普通索引
create index idx_stu_name on stu(sname)

查看索引
show index from stu

删除索引
drop index idx_stu_name on stu

alter指令

1). alter table tb_name add primary key(column_list);
该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL

2).1lter table tb_name add unique index_name(column_list);
这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)

3). altertabletb_name add index index_name(column_list);
添加普通索引,索引值可以出现多次。

4). alter table tb_name add fulltext index_name(column_1ist);
该语句指定了索引为FULLTEXT,用于全文索引

索引设计原则

索引的设计可以遵循一些已有的原则,创建索引的时候请尽量考虑符合这些原则,便于提升索引的使用效率,更高效的使用索引。

--对查询频次较高,且数据星比较大的表建立索引。
--索引字段的选择,最佳候选列应当从where子句的条件中提取,如果where子句中的组合比较多,那么应当挑选最常用、过滤效果最好的列的组合。
--使用唯一索引,区分度越高,使用索引的效率越高。

--索引可以有效的提升查询数据的效率,但索引数量不是多多益善,索引越多,维护索引的代价自然也就水涨船高。对于插入、更新、删除等DML操作比较频繁的表来说,索引过多,会引入相当高的维护代价,降低DML操作的效率,增加相应操作的时间消耗。另外索引过多的话,MySQL也会犯选择困难病,虽然最终仍然会找到一个可用的索引,但无疑提高了选择的代价。

--使用短索引,索引创建之后也是使用硬盘来存储的,因此提升索引访问的/O效率,也可以提升总体的访问效率。假如构成索引的字段总长成比较短,那么在给定大小的存储块内可以存储更多的索引值,相应的可以有效的提升MySQL访问索引的/O效率。

--利用最左前缀,N个列组合而成的组合索引,那么相当于是创建了N个索引,如果查询时where子句中使用了组成该索引的前几个字段,那么这条查询SQL可以利用组合索引来提升查询效率。

视图概述

视图(View )是一种虚拟存在的表。视图并不在数据库中实际存在,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生
成的I通俗的讲,视图就是一条SELECT语句执行后返回的结果集。所以我们在创建视图的时候,主要的工作就落在创建这条SQL查询语句上。
视图相对于普通的表的优势主要包括以下几项。
·简单︰使用视图的用户完全不需要关心后面对应的表的结构、关联条件和筛选条件,对用户来说已经是过滤好的复合条件的结果集。
·安全:使用视图的用户只能访问他们被允许查询的结果集,对表的权限管理并不能限制到某个行某个列,但是通过视图就可以简单的实现.
数据独立∶一旦视图的结构确定了,可以屏蔽表结构变化对用户的影响,源表增加列对视图没有影响﹔源表修改列名,则可以通过修改视图来解
决,不会造成对访问者的影响。

基本语法

视图(本质是SQL指令,字段不允许重明,在多表联查的时候需要起别名)
   基本语法: create view 视图名 as select指令  //创建视图,加上as关键字
视图本身没有数据,是临时执行的select语句得到的对应结果,主要用于查询操作
   适用于表的操作也适用于视图
       show create view 视图名字。。。。;
   select 字段列表 from 视图名字 [子句]
       修改视图:  alter view 视图名字 as 新的select指令
       删除视图:  drop view 视图名字;

事务

事务(transaction) 是访问并可能更新数据库中各种数据项的一个程序执行单元(unit).事务通常由高级数据库操纵语言或变成语言书写的用户程序的执行锁引起的,事务由事务开始(begin transaction) 和事务结束(end transaction) 之间执行的全体操作组成mydql允许将事务统一进行管理(需要存储引擎为INNODB),将用户所作的操作,暂时保存起来(保存到事务日志中),不直接放到数据表(更新数据),等到用于确认结果之后再进行操作事务再mysql中通常是自动提交的,但也可以使用手动事务

基本语法

自动事务:autocommit,当客户端发送一条sql指令(写操作,增删改)给服务器的时候,服务器在执行之后,不用等待用户反馈结果,会自动将结果同步到数据表系统做了额外的步骤来帮助用户操作,系统是通过变量来控制的

show variables like 'autocommit' ; //查看事务状态

关闭自动事务:

set autocommit = off/0;

通常不会关闭自动事务,因此只会在需要使用事务处理的时候,才会进行操作(手动事务) 一旦自动事务关闭,那么需要用户提供是否同步的命令.

commit ; 提交(同步到数据表,事务会被清空)
rollback ; 回滚(清空之前的操作)

手动事务:不管是开始还是过程还是结束都需要用户手动发送事务操作指令来实现

start transaction;      //开启事务

从这条语句开始,后面的所有语句都不会直接写入到数据表(保存到事务日志中)
事务开启后,操作执行成功,虽然没有同步到数据表,但当前客户端查询的时候,系统会自动根据日志表中的操作进行数据加工
   事务处理:多个写指令构成
   事务提交:commit/rollback;  到此所有事务才算结束
   回滚点: savepoint 当由一系列事务操作时,而其中步骤如果成功了,没有必要重新来过,可以在某个点(成功点)设置一个记号(回滚点)
   如果后面失败,可以回到这个记号位置
   增加回滚点:  savepoint 回滚点名字 ;  字母和数字下划线构成
   回到回滚点: rollback  回滚点名字 ;  那个记号之后的操作就没有了
   在一个事务中,如果有很多步骤,可以设置多个回滚点,但是如果回到之前的回滚点,之后的回滚点就失效了

数据的备份与还原

整数据库备份也叫sql数据备份,备份的结果都是SQL指令
在Mysql中提供了一个专门用于备份SQL的客户端,mysqldunop.exe
   应用场景:sql备份是一种mysql非常常见的备份与还原方式,SQL备份不只是备份数据,还备份对应的SQL指定(表结构),即使是数据库遭到毁灭性的破坏,例用SQL备份依然可以实现数据还原
SQL备份因为需要备份表结构,因此产生的备份文件特别大,因此不适合特大型数据备份,也不适合数据变换频繁型数据库备份。

SQL备份用到专门的备份客户端,因此还没与数据库服务进行连接(不用再sql环境下,直接再客户端下)
基本语法: mysqldump/mysqldump.exe -hPup  数据库名字  [表1  [表2] ] > 备份文件地址
备份的三种形式:

1.整库备份(只需要提供数据库名字)
mysqldump -hlochost  -P3306     -uroot -p123456 mydatabase1 > f:/sql/temp/mydatabase1.sql
客户端名    服务器地址(可省)   端口号(可省)  账号 密码     数据库名     备份到哪去
2.单表备份:数据库后跟一张表
3.多表备份 :数据库后面跟多张表
mysqldump -uroot -proot mydatabase2 my_student my_class > f:/sql/temp/mydatabase1.sql
 客户端       账号   密码     数据库名       表1      表2                 备份到哪去                 (多表备份表名用空格隔开)

变量

查看系统变量  :   show variables  [like 'pattern'];
查看系统变量的值:  select @@变量名;

修改系统变量分为两种方式:
   1.局部修改(会话级别):只针对当前自己客户端当此连接有效
   基本语法:set 变量名 = 新值;
   2.全局修改:针对所有客户端,“所有时刻"都有效  (修改之后只针对新客户端生效,正在连着的无效)

基本语法:set global 变量名 = 值 ; ||   set @@global.变量名 = 值 ;
    注意:如果想要本次连接对应的变量修改有效,那么不能使用全局修改,只能使用会话级别修改

会话变量:会话变量跟mysql客户端是绑定的,设置的变量,只对当前用户使用的客户端生效

定义用户变量: set @变量名 = 值;

在mysql中因为没有比较符合==,所以是用=代替比较符号,有时候在赋值的时候,会报错,mysql为了避免系统分不清是赋值还是比较,特定增加了一个变量的赋值符号:     :=

set @变量名  := 值;

mysql是专门存储数据的,允许将数据从表重取出存储到变量中,查询得到的数据必须只能是一行数据(一个变量对应一个字段值)

1.赋值且查看赋值过程:  select @变量1 := 字段1,@变量2 := 字段2 from 数据表  where 条件    
//如果使用 = ,系统视为比较符号,返回0/1
2.只赋值不看过程 : select 字段1,字段2... from 数据源 where 条件 into @变量1,@变量2...;
查看自定义变量:   select @变量名;
局部变量: 作用范围在beginend之间,在该语句块设置的变量,declare语句专门用于定义局部变量
1.局部变量是使用declare声明
2.局部变量declare语句出现位置一定在beginend之间
3.声明语法: declare 变量名 数据类型[属性];

流程结构

if分支

基本语法:

    1.用在select查询当中,当作一种条件来判断
    if(条件,为真结果,为假结果)
    select * ,if(age>20,"符合","不符合") as judge from student;
    2.用在复杂的语句块中(函数/存储过程/触发器)
    if  条件表达式  then
        满足条件要执行的语句;
    end if;
    符合语法:判断代码存在两面性,两面都有对应代码执行
    if 条件表达式 then
        满足条件执行的语句;
        //如果需要进行多次判断,里面只能嵌套if,不能else if
            if  条件表达式 then 
                语句;
                    else
                        语句;
            end if//每一个if表达式都需要一个end if语句来结束
    else
            不满足条件执行的语句;
    end if;

循环

基本语法:  while 条件  do
            要循环执行的代码;
        end while;
标识符的存在主要是为了循环体中使用循环控制,在mysql中没有continue和breanl,有自己的关键字代替
iterate: 迭代 ,就是以下代码不执行,重新开始循环(continue)
leave : 离开 , 整个循环终止(break)
        标识名字:while 条件  do
                if 条件判断 then
                    循环控制;
                    iterate/leave  表示名字;
                end if;
                    要循环执行的代码;
                end while [标识名字] ;


delimiter  $$;         临时修改程序结束符号


文章转载自JAVA不归路,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论