linux服务器- 理解和使用 mysql 5.7 版本 索引,事务,视图,存储过程和存储引擎(MyISAM,InnoDB)以及数据库的三大范式

文章目录

  • 前言
  • 一:索引
    • 1.1:什么是索引(index)?
    • 1.2:索引有什么作用?
    • 1.3:索引的优缺点是什么?
    • 1.4:索引的分类
    • 1.5:创建索引有什么原则依据?
    • 1.6:什么是外键?
    • 1.7:如何创建索引?
    • 二:事务
    • 2.1:什么是事务?
    • 2.2:事务有什么特点?
      • 2.2.1:原子性(Atomicity)
      • 2.2.2:一致性(Consistency)
      • 2.2.3:隔离性(Isolation)
      • 2.2.4:持久性(Durability)
    • 2.3:如何操作事务?
      • 2.3.1:控制事务的方法有哪些?
      • 2.3.2:控制事务的命令有哪些?
      • 2.3.3:如何存档?
      • 2.3.4:如何回滚?
    • 3.1:视图
      • 3.1.1:什么是视图?
      • 3.1.2:创建和查询视图命令是?
      • 3.1.3:视图特点
    • 3.2:存储过程
      • 3.2.1:什么是存储过程?
      • 3.2.2:存储过程有什么优点?
  • 四:存储引擎
    • 4.1:什么是存储引擎?
    • 4.2:MyISAM
      • 4.2.1:什么是MyISAM?
      • 4.2.2:MyISAM有什么特点?
      • 4.2.3:什么生产场景适合使用MyISAM
    • 4.3:InnoDB
      • 4.3.1:InnoDB有什么特点?
      • 4.3.2:什么生产场景适合使用InnoDB?
    • 4.4:生产环境中依据什么选择存储引擎?
    • 4.5:如何配置存储引擎?
    • 4.6:如何修改存储引擎?
  • 五.索引具体配置实操案例
    • 5.1 添加索引的3种方式
    • 5.2 查看索引的方法
    • 5.3创建组件索引
    • 5.4创建主键索引
    • 5.5添加全文索引(只能是字符类型)
    • 5.6 删除索引表的2种方法
  • 六. 事务与引擎的具体配置案例
    • 6.1 事务的开始 与 回滚
    • 6.2 事务的提交
    • 6.3 创建目录点及加载目录点
    • 6.4 关闭自动提交功能的设置方法
    • 6.5 设置引擎
  • 七 . 数据库的三大范式(扩展)

前言

一:索引

1.1:什么是索引(index)?

数据库中的索引与书籍中的目录类似
在一本书中,无须阅读整本书,利用目录就可以快速査找所需信息
书中的目录是一个词语列表,其中注明了包含各个词的页码
数据库索引
在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据
数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单

1.2:索引有什么作用?

设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率
特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍
可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本
通过创建唯一性索引保证数据表数据的唯一性
可以加快表与表之间的连接
在使用分组和排序时,可大大减少分组和排序时间

1.3:索引的优缺点是什么?

优点
可以快速的找到所需要的的资源
缺点
占用空间

1.4:索引的分类

普通索引
这是最基本的索引类型,而且它没有唯一性之类的限制
唯一性索引
这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一
主键
主键是一种唯一性索引,但它必须指定为“ PRIMARY KEY
全文索引
MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在 ARCHAR或者TEXT类型的列上创建
单列索引与多列索引
索引可以是单列上创建的索引,也可以是在多列上创建的索引

1.5:创建索引有什么原则依据?

表的主键、外键必须有索引
数据量超过300行的表应该有索引
经常与其他表进行连接的表,在连接字段上应该建立索引
唯一性太差的字段不适合建立索引
更新太频繁地字段不适合创建索引
经常出现在 Where子句中的字段,特别是大表的字段,应该建立索引
索引应该建在选择性高的字段上
索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

1.6:什么是外键?

主表中的外键是令一张表的主键

1.7:如何创建索引?

根据企业需求选择了合适的索引之后,可使用 CREATE INDEX创建索引

CREATE INDEX加上各个索引关键字便可创建各个类型的索引

创建普通索引

语法:
create index <索引的名字> on tablename(列的列表);
例如:
create index salary on IT_salary;
'//一张表同一列可以做多个索引'

创建唯一性索引

语法:

create unique index <索引的名字> on tablename(列的列表);
例如:
create unique index salary_unique on IT_salary;

创建主键索引

语法:

create table tablename([...],primary key(列的列表));
alter table tablename add primary key(列的列表)

例如:

alter table IT_salary add primary key;
'//创建主键索引的两种方式,创建表的时候指定主键索引和后期增加主键索引'

创建全文索引

语法:

create fulltext index <索引的名字> on tablename(列的列表);
例如:
create fulltext index full_index_addr on IT_salary(addr);
'//全文索引:往往用于字符串,而不适用于数值类型'

1.8:如何查看索引?

语法:
show index from tablename;
show keys from tablename;
例如:
show index from IT_salary;
show keys from IT_salary;

1.9:表的文件分类
表的结构文件
表的数据文件
表的索引文件
myisam不支持事务,但经常被访,被读取性能较好。
1.10:创建表和索引的小知识点

create table info (id int not null primary key auto_increment,name char(10) not null,score decimal(5,2);
'//decimal:浮点型,小数点,例如:decimal(5,2)表示五个有效数字,两个小数,例如:100.00'
'//int不填写具体指,默认为11个字符'
'//插入数据时,不写列的时候,默认是从第一个列开始匹配'

二:事务

2.1:什么是事务?

事务是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
事务是一个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
适用于多用户同时操作的数据库系统的场景,如银行、保险公司及证券交易系统等等
通过事务的整体性以保证数据的一致性
如果事务成功了一部分,一部分未成功,则执行回滚,回到事务的起点,重新开始操作

2.2:事务有什么特点?

2.2.1:原子性(Atomicity)

事务是一个完整的操作,事务的各元素是不可分的(原子的)
事务中的所有元素必须作为一个整体提交或回滚
如果事务中的任何元素失败,则整个事务将失败

2.2.2:一致性(Consistency)

当事务完成时,数据必须处于一致状态!
在事务开始之前,数据库中存储的数据处于一致状态;
在正在进行的事务中,数据可能处于不一致的状态;
当事务成功完成时,数据必须再次回到已知的一致状态

2.2.3:隔离性(Isolation)

对数据进行修改的所有并发事务是彼此隔离的,这表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据

2.2.4:持久性(Durability)

事务持久性指不管系统是否发生故障,事务处理的结果都是永久的
一旦事务被提交,事务的效果会被永久地保留在数据库中

2.3:如何操作事务?

默认情况下 MySQL的事务是自动提交的,当sql语句提交时事务便自动提交

2.3.1:控制事务的方法有哪些?

手动对事务进行控制的方法
事务处理命令控制
使用set设置事务处理方式

2.3.2:控制事务的命令有哪些?

使用事务处理命令控制事务

bein:开始一个事务
commit:提交一个事务
rollback:回滚一个事务
使用set命令进行控制
set autocommit=0:禁止自动提交
set autocommit=1:开启自动提交

2.3.3:如何存档?

格式:
savepoint <存档点名称>;
例如:
savepoint s1;

2.3.4:如何回滚?

格式:
rollback  to <存档点名称>;
例如:
rollback to s1;		'//回到s1的存档点'
rollback;	'//回到begin'
'//rollback只能向前回滚,无法向后回滚'
'//commit提交后,事务结束,此时再次使用的rollback属于另一个新的事务,对于已经commit的事务没有任何作用'

三:视图和存储过程

3.1:视图

3.1.1:什么是视图?

视图是一张虚拟的表,数据不存在视图中,视图是真实表的映射数据。例如:水中捞月是典型的视图
利用条件筛选,分组,排序等产生出一个结果集(结果集保存在内存中),并且做成持久化保存(保存映射)
视图占用资源小,真实表中数据产生变化,会影响到视图。

3.1.2:创建和查询视图命令是?

创建视图
create view <视图名称>
create view info_view as select id,name,age from info 条件
多表相连的条件是on
单表相连的条件是where
查询视图
select * from info_view;
select name,age from info_view;

查询多表相连

select info.id,info.name,info.age,info,score,info.addr,hob.hobname from info inner join hob on info.hobby=hob.id; ‘//从info表和hob表中选择info.id,info.name,info.age,info,score,info.addr,hob.hobname且info表中的hobby=hob表中的id’
‘//inner join:内部相连’

创建多表相连查询视图

create view info_hob_view as select info.id,info.name,info.age,info,score,info.addr,hob.hobname from info inner join hob on info.hobby=hob.id; ‘//将刚刚的多表相连查询创建名为info_hob_view的视图’
select * from info_hob_view; ‘//查看视图’

3.1.3:视图特点

安全性高
简化sql操作
可以针对不同用户创建不同的视图(不同权限的用户浏览不同的信息)

3.2:存储过程

3.2.1:什么是存储过程?

存储过程:多用于软件开发方向,

防止代码在网络传输过程中被截获,做了安全性保障。

原始状态:在代码过程中:需要嵌入sql语句,通过连接驱动把sql语句作为参数,传递给MySQL(数据库)进行执行,此时就会有安全风险。

通过存储过程解决安全隐患

存储过程是写在数据库中,并不是程序中。

程序是通过调用存储过程名称去触发sql操作。(类似调用函数)

3.2.2:存储过程有什么优点?

存储过程优点:代码量优化,传输安全,网络资源优化

四:存储引擎

4.1:什么是存储引擎?

MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在 MySQL中称为存储引擎

存储引擎就是 MySQL将数据存储在文件系统中的存储方式或者存储格式

目前 MySQL常用的两种存储引擎

MyISAM
InnoDB
MySQL存储引擎是 MySQL数据库服务器中的组件,负责为数据库执行实际的数据I/O操作

使用特殊存储引擎的主要优点之一在于:

仅需提供特殊应用所需的特性
数据库中的系统开销较小
具有更有效和更高的数据库性能
MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

mark

从程序开发角度来说:

不同语言安装不同的驱动创建不同的connector
connection pool中有多个对象(空闲的进程/线程)
connector和connection pool的对象连接MySQL server
连接池作用:优化连接效率
从系统角度:

依靠进程或者线程链接数据库的对象,就需要.sock文件创建pid去连接

具体文件内容通过存储引擎存储在硬盘上,通过各种管理工具(Management Server)管理

privilege:特权

parser:分析器

query:查询

optimizer:优化程序

数据库的日志文件是重中之重,需要单独备份。

4.2:MyISAM

4.2.1:什么是MyISAM?

MyISAM存储引擎是 MySQL关系数据库系统5.5版本之前默认的存储引擎,前身是ISAM
ISAM是一个定义明确且历经时间考验的数据表格管理方法,在设计之时就考虑到数据库被查询的次数要远大于更新的次数
ISAM的特点
优点:ISAM执行读取操作的速度很快
优点:不占用大量的内存和存储资源
缺点:不支持事务处理
缺点:不能够容错
MyISAM管理非事务表,是lSAM的扩展格式
提供ISAM里所没有的索引和字段管理的大量功能
MyISAM使用一种表格锁定的机制,以优化多个并发的读写操作
MyISAM提供高速存储和检索,以及全文搜索能力,受到web开发的青睐

4.2.2:MyISAM有什么特点?

不支持事务
表级锁定形式,数据在更新时锁定整个表
数据库在读写过程中相互阻塞
会在数据写入的过程阻塞用户数据的读取
也会在数据读取的过程中阻塞用户的数据写入
可通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘I/O的压力
但缓存只会缓存索引文件,不会缓存数据
釆用 MyISAM存储引擎数据单独写入或读取,速度过程较快且占用资源相对少
MyISAM存储引擎它不支持外键约束,只支持全文索引
每个 MyISAM在磁盘上存储成三个文件,每一个文件的名字以表的名字开始,扩展名指出文件类型
MyISAM在磁盘上存储的文件
.frm文件存储表定义
数据文件的扩展名为.MYD( MYData)
索引文件的扩展名是.MYI( MYIndex)

4.2.3:什么生产场景适合使用MyISAM

公司业务不需要事务的支持
一般单方面读取数据比较多的业务,或单方面写入数据比较多的业务
MyISAM存储引擎数据读写都比较频繁场景不适合
使用读写并发访问相对较低的业务
数据修改相对较少的业务
对数据业务一致性要求不是非常高的业务
服务器硬件资源相对比较差

4.3:InnoDB

4.3.1:InnoDB有什么特点?

支持事务:支持4个事务隔离级别
行级锁定,但是全表扫描仍然会是表级锁定
读写阻塞与事务隔离级别相关
具有非常高效的缓存特性:能缓存索引,也能缓存数据
表与主键以簇的方式存储
支持分区、表空间,类似 oracle数据库
支持外键约束,5.5以前不支持全文索引,5.5版本以后支持全文索引
对硬件资源要求还是比较高的场合

4.3.2:什么生产场景适合使用InnoDB?

业务需要事务的支持
行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成
业务数据更新较为频繁的场景,如:论坛,微博等
业务数据一致性要求较高,例如:银行业务
硬件设备内存较大,利用 Innodb较好的缓存能力来提高内存利用率,减少磁盘I/O的压力

4.4:生产环境中依据什么选择存储引擎?

需要考虑毎个存儲引擎提供了哪些不同的核心功能及应用场景

支持的字段和数据类型
●所有引擎都支持通用的数据类型
●但不是所有的引擎都支持其它的字段类型,如二进制对象

锁定类型:不同的存储引擎支持不同级别的锁定
●表锁定
●行锁定

索引的支持
●建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能
●不同的存储引擎提供不同的制作索引的技术
●有些存储引擎根本不支持索引

事务处理的支持

●事务处理功能通过提供在向表中更新和插入信息期间的可靠性
●可根据企业业务是否要支持事务选择存储引擎

4.5:如何配置存储引擎?

在企业中选择好合适的存储引擎之后,就可以进行修改了

修改步骤
●查看数据库可配置的存储引擎
●查看表正在使用的存储引擎
●配置存储引擎为所选择的类型

使用 show engines查看系统支持的存储引擎

查看表使用的存储引擎

方法1:show table status from库名 where name=表名;
方法2:show create table表名;'//常用'
例如:
MySQL > show table status from yibiao where name='wangermazi'\G 
'//使用\G代替分号表示垂直显示结果'

4.6:如何修改存储引擎?

共有四种方法

方法一:

alter table 修改;
格式:
alter table table_name engine=引擎;
例如:
MySQL> alter table user_info engin=MyISAM;

方法二:

修改my.cnf,指定默认存储引擎并重启服务
格式:
default-storage-engine=InnoDB
例如:
vim my.cnf
default-storage-engine=InnoDB

方法三:

create table 创建表时指定存储引擎
格式:
create table 表名 (字段) engine=引擎
例如:
MySQL> create table yibiao(id int)engine=MyISAM;

方法四:

Mysql_convert_table_format转化存储引擎
格式:
Mysql_convert_table_format-user=root--password=密码--sock=/tmp/mysql.sock-engine=引擎 库名 表名
例如:
[root@localhost ~]# yum install perl-DBI perl-DBD-MySQL -y
[root@localhost ~]# /usr/local/mysql/bin/bysql_convert_table_format --user=root --passwork='123' --sock=/

五.索引具体配置实操案例

5.1 添加索引的3种方式

第一种添加ID索引

mysql> create index id_shanan on shanan(id);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)

mysql> desc shanan;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra   |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   |     | NULL    |   |
| score   | decimal(5,2) | YES  |     | NULL    |   |
| address | varchar(50)  | YES  |     | 未知    |   |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql>

第二种添加name索引

mysql> mysql> alter table shanan add index name_shanan (name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> desc shanan;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra   |
+---------+--------------+------+-----+---------+----------------+
| id      | int(3)       | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10)  | NO   | MUL | NULL    |   |
| score   | decimal(5,2) | YES  |     | NULL    |   |
| address | varchar(50)  | YES  |     | 未知    |   |
+---------+--------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

mysql>
第三种,创建表的时候创建索引
mysql> create table pig (id int ,index id_pig(id));
Query OK, 0 rows affected (0.01 sec)

mysql> desc pig;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  | MUL | NULL    |       |
+-------+---------+------+-----+---------+-------+
1 row in set (0.00 sec)

5.2 查看索引的方法

查看索引,加G 竖着查看,不加横着查看

mysql> show index from shanan\G;
*************************** 1. row ***************************
        Table: shanan
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 2
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 2. row ***************************
        Table: shanan
   Non_unique: 1
     Key_name: id_shanan
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 2
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
*************************** 3. row ***************************
        Table: shanan
   Non_unique: 1
     Key_name: name_shname_shanan
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 2
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
3 rows in set (0.00 sec)

ERROR:
No query specified

mysql>

5.3创建组件索引

mysql> create unique index unique_shanan on shanan(name);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from info\G;
ERROR 1146 (42S02): Table 'school.info' doesn't exist
ERROR:
No query specified

mysql> show index from shanan\G;
......
*************************** 2. row ***************************
        Table: shanan
   Non_unique: 0
     Key_name: unique_shanan
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 2
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
............

组件里面的值只能出现一次,重复添加会报错(值可以为空,但只有一次)

mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)

mysql> insert into shanan (name,score,address ) value ('zhangsan',99,'bj');
ERROR 1062 (23000): Duplicate entry 'zhangsan' for key 'unique_shanan'

5.4创建主键索引

mysql> create table dog (id int(11) not null auto_increment,title char(255) not null,primary key (id));
Query OK, 0 rows affected (0.01 sec)

mysql> desc dog;
+-------+-----------+------+-----+---------+----------------+
| Field | Type      | Null | Key | Default | Extra          |
+-------+-----------+------+-----+---------+----------------+
| id    | int(11)   | NO   | PRI | NULL    | auto_increment |
| title | char(255) | NO   |     | NULL    |                |
+-------+-----------+------+-----+---------+----------------+
2 rows in set (0.00 sec)

mysql> show index from dog\G;
*************************** 1. row ***************************
        Table: dog
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null:
   Index_type: BTREE
      Comment:
Index_comment:
1 row in set (0.00 sec)

ERROR:
No query specified

5.5添加全文索引(只能是字符类型)

设置整形数字,提示错误
mysql> alter table shanan add fulltext index addr_shanan(id)
    -> ;
ERROR 1283 (HY000): Column 'id' cannot be part of FULLTEXT index
设置字符,成功
mysql> alter table shanan add fulltext index addr_shanan(address);
Query OK, 0 rows affected, 1 warning (0.07 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> show index from shanan\G;
  Column_name: address
    Collation: NULL
  Cardinality: 2
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: FULLTEXT
      Comment:
Index_comment:
5 rows in set (0.00 sec)

ERROR:
No query specified

mysql>

5.6 删除索引表的2种方法

mysql> show index from shanan;
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| shanan |          0 | PRIMARY            |            1 | id          | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          0 | unique_shanan      |            1 | name        | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          1 | id_shanan          |            1 | id          | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          1 | name_shname_shanan |            1 | name        | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          1 | addr_shanan        |            1 | address     | NULL      |           2 |     NULL | NULL   | YES | FULLTEXT   |         |               |
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
5 rows in set (0.00 sec)

删除索引的第一种方法

mysql> drop index addr_shanan on shanan;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from shanan;
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| shanan |          0 | PRIMARY            |            1 | id          | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          0 | unique_shanan      |            1 | name        | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          1 | id_shanan          |            1 | id          | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          1 | name_shname_shanan |            1 | name        | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
4 rows in set (0.00 sec)

删除索引第二种方法

mysql> alter table shanan drop index id_shanan;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from shanan;
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table  | Non_unique | Key_name           | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| shanan |          0 | PRIMARY            |            1 | id          | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          0 | unique_shanan      |            1 | name        | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
| shanan |          1 | name_shname_shanan |            1 | name        | A         |           2 |     NULL | NULL   | | BTREE      |         |               |
+--------+------------+--------------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

mysql>

六. 事务与引擎的具体配置案例

5.7版本默认是自动提交的

6.1 事务的开始 与 回滚

mysql> begin;    //事务的开始
Query OK, 0 rows affected (0.00 sec)

mysql> insert into shanan (name,score,address)value('wangwu',66,'sh');   添加内容
Query OK, 1 row affected (0.00 sec)

mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
|  5 | wangwu   | 66.00 | sh      |
+----+----------+-------+---------+
3 rows in set (0.00 sec)
mysql> rollback;   回滚,回滚到上一个开始
Query OK, 0 rows affected (0.00 sec)

mysql> select * from shanan;  再次查看内容,发现刚添加的内容没有了
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
+----+----------+-------+---------+
2 rows in set (0.00 sec)

6.2 事务的提交

Commit  提交  ,一旦提交之后,数据将保存到硬盘,代表事务的结束,回滚也会到此

mysql> begin
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into shanan (name,score,address)value('zhaoliu',56,'js');
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
|  6 | wangwu   | 66.00 | sh      |
|  7 | zhaoliu  | 56.00 | js      |
+----+----------+-------+---------+
4 rows in set (0.00 sec)

执行回滚

mysql> rollback;  
Query OK, 0 rows affected (0.00 sec)
查看内容
mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
|  6 | wangwu   | 66.00 | sh      |
|  7 | zhaoliu  | 56.00 | js      |
+----+----------+-------+---------+
4 rows in set (0.00 sec)

6.3 创建目录点及加载目录点

mysql> begin;  事务开始
Query OK, 0 rows affected (0.00 sec)
添加一行内容
mysql> insert into shanan (name,score,address)value('wangba',79,'sk');
Query OK, 1 row affected (0.00 sec)
mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
|  6 | wangwu   | 66.00 | sh      |
|  7 | zhaoliu  | 56.00 | js      |
|  8 | tianqi   | 59.00 | sk      |
|  9 | wangba   | 79.00 | sk      |
+----+----------+-------+---------+
6 rows in set (0.00 sec)

创建目录点A

mysql> savepoint a ;
Query OK, 0 rows affected (0.00 sec)
继续添加内容
mysql> insert into shanan (name,score,address)value('xiaojiu',75,'sk');
Query OK, 1 row affected (0.00 sec)

mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
|  6 | wangwu   | 66.00 | sh      |
|  7 | zhaoliu  | 56.00 | js      |
|  8 | tianqi   | 59.00 | sk      |
|  9 | wangba   | 79.00 | sk      |
| 10 | xiaojiu  | 75.00 | sk      |
+----+----------+-------+---------+
7 rows in set (0.00 sec)
添加目录点B
mysql> savepoint b;
Query OK, 0 rows affected (0.00 sec)

回滚到目录点A,成功

mysql> rollback to a;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
|  6 | wangwu   | 66.00 | sh      |
|  7 | zhaoliu  | 56.00 | js      |
|  8 | tianqi   | 59.00 | sk      |
|  9 | wangba   | 79.00 | sk      |
+----+----------+-------+---------+
6 rows in set (0.00 sec)

回滚到目录点B 失败,因为没有提交的事务是保存在内存当中,所以回滚到A的时候自动清除了B的数据,以至于找不到B的目录点,事务的结束之后,目录点也无用了。

mysql> rollback to b;
ERROR 1305 (42000): SAVEPOINT b does not exist
mysql>

6.4 关闭自动提交功能的设置方法

Mysql 7 默认是自动提交的, 现在关闭自动提交功能,并测试

mysql> set autocommit=0  // 0是关闭  ,1 是开启
    -> ;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into shanan (name,score,address)value('dagou',75,'sk');
Query OK, 1 row affected (0.00 sec)

mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
|  6 | wangwu   | 66.00 | sh      |
|  7 | zhaoliu  | 56.00 | js      |
|  8 | tianqi   | 59.00 | sk      |
|  9 | wangba   | 79.00 | sk      |
| 11 | dagou    | 75.00 | sk      |
+----+----------+-------+---------+
7 rows in set (0.00 sec)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from shanan;
+----+----------+-------+---------+
| id | name     | score | address |
+----+----------+-------+---------+
|  1 | zhangsan | 88.00 | nanjing |
|  3 | lisi     | 78.00 | beijing |
|  6 | wangwu   | 66.00 | sh      |
|  7 | zhaoliu  | 56.00 | js      |
|  8 | tianqi   | 59.00 | sk      |
+----+----------+-------+---------+
5 rows in set (0.00 sec)

mysql>

6.5 设置引擎

mysql> alter table bigdog engine=myisam;
Query OK, 5 rows affected (0.01 sec)
Records: 5  Duplicates: 0  Warnings: 0

mysql> alter table bigdog engine=innodb;
Query OK, 5 rows affected (0.02 sec)
Records: 5  Duplicates: 0  Warnings: 0

七 . 数据库的三大范式(扩展)

前关系数据库有六种范式:第一范式(1NF)、第二范式(2NF)、第三范式(3NF)、巴斯-科德范式(BCNF)、第四范式(4NF)和第五范式(5NF,又称完美范式)。一般说来,数据库只需满足第三范式(3NF)就行了。下面用画图方式简单介绍下前三范式

1NF:无重复的列,每一列都是不可分割的基本数据项,同一 列中不能有多个值,即实体中的某个属性不能有多个值或者不 能有重复的属性。除去同类型的字段,就是无重复的列
说明:第一范式(1NF)是对关系模式的基本要求,不满足第 一范式(1NF)的数据库就不是关系数据库linux服务器- 理解和使用 mysql 5.7 版本 索引,事务,视图,存储过程和存储引擎(MyISAM,InnoDB)以及数据库的三大范式_第1张图片
2NF:属性完全依赖于主键,第二范式必须先满足第一范式, 要求表中的每个行必须可以被唯一地区分。通常为表加上一个 列,以存储各个实例的唯一标识PK,非PK的字段需要与整个 PK有直接相关性

linux服务器- 理解和使用 mysql 5.7 版本 索引,事务,视图,存储过程和存储引擎(MyISAM,InnoDB)以及数据库的三大范式_第2张图片
3NF:属性不依赖于其它非主属性,满足第三范式必须先满足 第二范式。第三范式要求一个数据库表中不包含已在其它表中 已包含的非主关键字信息,非PK的字段间不能有从属关系linux服务器- 理解和使用 mysql 5.7 版本 索引,事务,视图,存储过程和存储引擎(MyISAM,InnoDB)以及数据库的三大范式_第3张图片
总结:
第一范式:确保每列的原子性(强调的是列的原子性,即列不能够再分成其他几列).
如果每列(或者每个属性)都是不可再分的最小数据单元(也称为最小的原子单元),则满足第一范式.
例如:顾客表(姓名、编号、地址、……)其中"地址"列还可以细分为国家、省、市、区等。

第二范式:在第一范式的基础上更进一层,目标是确保表中的每列都和主键相关(一是表必须有一个主键;二是没有包含在主键中的列必须完全依赖于主键,而不能只依赖于主键的部分)
如果一个关系满足第一范式,并且除了主键以外的其它列,都依赖于该主键,则满足第二范式.
例如:订单表(订单编号、产品编号、定购日期、价格、……),"订单编号"为主键,"产品编号"和主键列没有直接的关系,即"产品编号"列不依赖于主键列,应删除该列。

第三范式:在第二范式的基础上更进一层,目标是确保每列都和主键列直接相关,而不是间接相关(另外非主键列必须直接依赖于主键,不能存在传递依赖).
如果一个关系满足第二范式,并且除了主键以外的其它列都不依赖于主键列,则满足第三范式.
为了理解第三范式,需要根据Armstrong公里之一定义传递依赖。假设A、B和C是关系R的三个属性,如果A-〉B且B-〉C,则从这些函数依赖中,可以得出A-〉C,如上所述,
依赖A-〉C是传递依赖。
例如:订单表(订单编号,定购日期,顾客编号,顾客姓名,……),初看该表没有问题,满足第二范式,每列都和主键列"订单编号"相关,再细看你会发现"顾客姓名"和"顾客
编号"相关,"顾客编号"和"订单编号"又相关,最后经过传递依赖,"顾客姓名"也和"订单编号"相关。为了满足第三范式,应去掉"顾客姓名"列,放入客户表中。

你可能感兴趣的:(数据库mysql,linux,mysql,数据库,服务器,运维)