mysql 索引、事务、视图、存储过程、存储引擎(mylsam、innodb)

前言:

之前的博客中介绍了mysql数据库的管理和SQL语句的基本运用,本篇博客将在此基础上介绍索引、事务、视图、存储过程和存储引擎(Mylsam,innodb)

一、索引

1.1 索引基本概念
  • 数据库中的索引与书籍中的目录类似

    在一本书中,无须阅读整本书,利用目录就可以快速查找所需信息

    书中的目录是一个词语列表,其中注明了包含各个词的页码

  • 数据库索引

    在数据库中,索引使数据库程序无须对整个表进行扫描,就可以在其中找到所需数据

    数据库中的索引是某个表中一列或者若干列值的集合,以及物理标识这些值的数据页的逻辑指针清单

1.2 索引的作用
  • 设置了合适的索引之后,数据库利用各种快速的定位技术,能够大大加快查询速率

  • 特别是当表很大时,或者查询涉及到多个表时,使用索引可使查询加快成干倍

  • 可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本

  • 通过创建唯一性索引保证数据表数据的唯一性

  • 可以加快表与表之间的连接

  • 在使用分组和排序时,可大大减少分组和排序时间

1.3 索引的优缺点
  • 索引的优点

    ① 大大加快数据的检索速度

    ② 创建唯一性索引,保证数据库表中每一行数据的唯一性

    ③ 加速表和表之间的连接

    ④ 在使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间

  • 索引的缺点

    ① 索引需要占物理空间

    ② 当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,降低了数据的维护速度

1.4 索引的分类
  • 普通索引

    这是最基本的索引类型,而且它没有唯一性之类的限制

  • 唯一性索引

    这种索引和前面的“普通索引”基本相同,但有一个区别:索引列的所有值都只能出现一次,即必须唯一

    唯一索引允许为空,但仅允许为空一次,

  • 主键

    主键是一种唯一性索引,但它必须指定为“ PRIMARY KEY

    主键索引具备唯一索引除允许为空外的特性

  • 全文索引

    MySQL从32323版开始支持全文索引和全文检索。在 MySQL中全文索引的索引类型为 FULLTEXT,全文索引可以在 ARCHAR或者TEXT类型的列上创建。

    如果非要为

  • 单列索引与多列索引

    索引可以是单列上创建的索引,也可以是在多列上创建的索引
    一般通过多列索引可以确保定位到某个实体

1.5 创建索引的原则依据
  • 表的主键、外键必须有索引 (外键允许重复,主键不允许⭐)

  • 数据量超过300行的表应该有索引

  • 经常与其他表进行连接的表,在连接字段上应该建立索引

  • 唯一性太差的字段不适合建立索引

  • 更新太频繁地字段不适合创建索引

  • 经常出现在 Where子句中的字段,特别是大表的字段,应该建立索

  • 索引应该建在选择性高的字段上

  • 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建索引

    如果必须需要建立索引,则建立full tex (全文索引)

1.6 创建索引

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

create index 加上各个索引关键字便可以创建各个类型的索引

示例

先创建一个数据库和一个数据表,之后的索引在此基础上进行

mysql> create database school;
Query OK, 1 row affected (0.01 sec)

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| test               |
+--------------------+
5 rows in set (0.00 sec)

mysql> use school;
Database changed

mysql> create table info ( ind int(4) not null primary key auto_increment, name varchar(10) not null, address varchar(50) default 'nj', age int(3) not null);
Query OK, 0 rows affected (0.04 sec)
#auto_increment 自动增长
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| info             |
+------------------+
1 row in set (0.00 sec)

向表中创建内容

mysql> insert into info(name,address,age) values ('liuyi','bj',20),('chener','sh',21);
Query OK, 2 rows affected (0.02 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from info;
+-----+--------+---------+-----+
| ind | name   | address | age |
+-----+--------+---------+-----+
|   1 | liuyi  | bj      |  20 |
|   2 | chener | sh      |  21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)
  • 创建索引有三种方式

    创建表 直接定义

    create index 索引名称 on 表名 (列名1,列名2)

    alter table 表名 add index 索引名称 (列名)(更改表结构方式)

创建表 直接定义示例:

mysql> create table user(
    -> id int(4) not null primary key auto_increment,
    -> name varchar(10) not null,
    -> score decimal not null,
    -> hobby int(2) not null default '1',
    -> index index_score(score));
Query OK, 0 rows affected (0.03 sec)
#在创建时直接定义score为索引
  • 查询索引有两种方式

    show index from info(表名);

    show keys from info(表名);

1.6.1 创建普通索引

普通索引创建语句为: create index <索引的名字> on tablename(列的列表);

mysql> create index index_age on info (age);
Query OK, 0 rows affected (0.09 sec)
Records: 0  Duplicates: 0  Warnings: 0
 
mysql> show index from info;  #查询info表的索引
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name  | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info  |          0 | PRIMARY   |            1 | ind         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          1 | index_age |            1 | age         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

查询可见除了primary主键索引之外还有一个index_age索引

同时删除索引语句:drop index index_age on info(表名);

mysql> drop index index_age on info;
Query OK, 0 rows affected (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from info; #查询info表的索引
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info  |          0 | PRIMARY  |            1 | ind         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)
1.6.2 创建唯一索引

唯一索引创建语句:create unique index unique_name(字段) on info (name);(表名(字段))

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

mysql> show index from info; #查询info表的索引
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name    | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info  |          0 | PRIMARY     |            1 | ind         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | unique_name |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

删除唯一索引语句:drop index unique_name on info;

1.6.3 创建主键索引

创建主键索引的语句

create table tablename([…]),primary key (列的列表));

alter table tablename add primary key (列的列表));

以上两种创建方式第一种在创建的时候进行定义,第二种在表创建完毕时以更改表结构的方式添加组件索引

1.6.4 创建全文索引

创建全文索引语法句:create fulltext index <索引的名字> on tablename (列的列表);

mysql> create fulltext index index_address on info(address);
Query OK, 0 rows affected, 1 warning (0.22 sec)
Records: 0  Duplicates: 0  Warnings: 1

mysql> show index from info; #查询info表的索引
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name      | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| info  |          0 | PRIMARY       |            1 | ind         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | unique_name   |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          1 | index_address |            1 | address     | NULL      |           2 |     NULL | NULL   | YES  | FULLTEXT   |         |               |
+-------+------------+---------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)
1.7 表的文件分类
  • 表的结构文件
  • 表的数据文件
  • 表的索引文件
  • mylsam不支持事务,但读取性能好。

补充一:这里介绍一种关联查询语句

首先先创建三个表,内容如下

mysql> select * from hob;
+----+----------+
| id | hob_name |
+----+----------+
|  1 | read     |
|  2 | running  |
|  3 | game     |
+----+----------+
3 rows in set (0.00 sec)

mysql> select * from info;
+-----+--------+---------+-----+
| ind | name   | address | age |
+-----+--------+---------+-----+
|   1 | liuyi  | bj      |  20 |
|   2 | chener | sh      |  21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)

mysql> select * from user;
+----+--------+-------+-------+
| id | name   | score | hobby |
+----+--------+-------+-------+
|  1 | test01 |    88 |     1 |
|  2 | stu01  |    99 |     2 |
|  3 | wangwu |    77 |     3 |
+----+--------+-------+-------+
3 rows in set (0.00 sec)

关联查询

mysql> select user.name,hob.hob_name from user inner join hob on user.hobby=hob.id;
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | read     |
| stu01  | running  |
| wangwu | game     |
+--------+----------+
3 rows in set (0.00 sec)

select user.name,hob.hob_name from user inner join hob on user.hobby=hob.id;

关联查询user表中的name与hob表中的hob.name,选择输出user.hobby与hob.id相等的字段。

inner join(关联) 表名1 on 表名2

也可以将表以别名的形式代替,示例

mysql> select u.name,h.hob_name from user u inner join hob h on u.hobby=h.id;
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | read     |
| stu01  | running  |
| wangwu | game     |
+--------+----------+
3 rows in set (0.00 sec)

补充二:创建表和索引的小知识点

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 事务的ACID特点
  • 原子性 (Atomictity)

    事务是一个完整的操作,事务的各元素是不可分的(原子的)

    事务中的所有元素必须作为一个整体提交或回滚

    如果事务中的任何元素失败,则整个事务将失败

  • 一致性 (Consistency)

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

  • 隔离性 (Isolation)

    对数据进行修改的所有并发事务时彼此隔离的,这表名事务必须是独立的,它不应以任何方式依赖于或影响其他事务

    修改数据的事务可以在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据

  • 持久性 (Durability)

    事务持久性指不管系统是否发生故障,事务处理的结果都是永久的

    一旦事务被提交,事务的效果会被永久的保留在数据库中

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

  • 手动对事务进行控制的方法

    事务处理命令控制

    使用set设置事务处理方式

2.3.1 事务处理命令控制
  • begin :开始一个事务
  • commit:提交一个事务
  • rollback:回滚一个事务
2.3.2 使用set命令进行控制
  • set autocommit=0:禁止自动提交
  • set autocommit=1:开始自动提交

示例

环境:在mysql中创建school数据库,创建info表,内容如下

mysql> select * from info;
+-----+--------+---------+-----+
| ind | name   | address | age |
+-----+--------+---------+-----+
|   1 | liuyi  | bj      |  20 |
|   2 | chener | sh      |  21 |
+-----+--------+---------+-----+c
2 rows in set (0.00 sec)

开始事务(方式一)

mysql> begin;     		     #开启事务
Query OK, 0 rows affected (0.00 sec)

mysql> update info set name='zhangsan' where name='liuyi';    			  #将name字段中liuyi改为zhangsan
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> commit;               #提交事务
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;
+-----+----------+---------+-----+
| ind | name     | address | age |
+-----+----------+---------+-----+
|   1 | zhangsan | bj      |  20 |
|   2 | chener   | sh      |  21 |
+-----+----------+---------+-----+
2 rows in set (0.00 sec)

开始事务(方式二)

mysql> set autocommit=0;  			#禁止事务自动提交
Query OK, 0 rows affected (0.00 sec)

mysql> update info set name='lisi' where name='chener';
Query OK, 1 row affected (0.00 sec)  #将info表name字段中chener更改为lisi
Rows matched: 1  Changed: 1  Warnings: 0

mysql> commit;						#提交事务
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;
+-----+----------+---------+-----+
| ind | name     | address | age |
+-----+----------+---------+-----+
|   1 | zhangsan | bj      |  20 |
|   2 | lisi     | sh      |  21 |
+-----+----------+---------+-----+
2 rows in set (0.00 sec)

回滚(rollback)

mysql> begin;						#开始十五
Query OK, 0 rows affected (0.00 sec)

mysql> update info set name='wangwu' where name='zhangsan';						#将info表name字段中zhangsan改为wangwu。
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from info;			#查看表信息
+-----+--------+---------+-----+
| ind | name   | address | age |
+-----+--------+---------+-----+
|   1 | wangwu | bj      |  20 |
|   2 | lisi   | sh      |  21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)

mysql> savepoint a;					#创建存档a
Query OK, 0 rows affected (0.00 sec)

mysql> update info set name='zhaoliu' where name='lisi';						#将info表name字段lisi更改为zhaoliu
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> savepoint b;					#创建存档b
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;			#查看表信息
+-----+---------+---------+-----+
| ind | name    | address | age |
+-----+---------+---------+-----+
|   1 | wangwu  | bj      |  20 |
|   2 | zhaoliu | sh      |  21 |
+-----+---------+---------+-----+
2 rows in set (0.00 sec)

mysql> rollback to a;				#回滚到存档a中(存档a之后的设置不生效)
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;			#查看表信息
+-----+--------+---------+-----+
| ind | name   | address | age |
+-----+--------+---------+-----+
|   1 | wangwu | bj      |  20 |
|   2 | lisi   | sh      |  21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)

mysql> rollback;					#回滚到事务开始,存档a的设置不生效
Query OK, 0 rows affected (0.01 sec)

mysql> select * from info;			#查看表信息
+-----+----------+---------+-----+
| ind | name     | address | age |
+-----+----------+---------+-----+
|   1 | zhangsan | bj      |  20 |
|   2 | lisi     | sh      |  21 |
+-----+----------+---------+-----+
2 rows in set (0.00 sec)

mysql> commit;						#提交事务
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;			#查看表信息
+-----+----------+---------+-----+
| ind | name     | address | age |
+-----+----------+---------+-----+
|   1 | zhangsan | bj      |  20 |
|   2 | lisi     | sh      |  21 |
+-----+----------+---------+-----+
2 rows in set (0.00 sec)

小结

  • 使用rollback只能向前回滚,无法向后
  • 使用commit提交后,事务结束,此时再次使用的rollback属于另一个新的事务,对于已经commit的食物没有任何作用
  • begin执行与autocommit类似。

三、视图与存储过程

3.1 视图的概念
  • 视图是一张虚拟的表,数据不存在试图中,真实表的映射数据
  • 利用,条件筛选,分组,排序等产生出一个结果集。并且做成持久化保存。(并不保存数据,只保存映射,存储于内存中)
  • 视图占用资源相对内存小,真实表中数据变化,视图会对应变化
3.2 创建视图

创建以下表

mysql> select * from hob;
+----+----------+
| id | hob_name |
+----+----------+
|  1 | read     |
|  2 | running  |
|  3 | game     |
+----+----------+
3 rows in set (0.00 sec)

mysql> select * from info;
+-----+--------+---------+-----+
| ind | name   | address | age |
+-----+--------+---------+-----+
|   1 | liuyi  | bj      |  20 |
|   2 | chener | sh      |  21 |
+-----+--------+---------+-----+
2 rows in set (0.00 sec)

mysql> select * from user;
+----+--------+-------+-------+
| id | name   | score | hobby |
+----+--------+-------+-------+
|  1 | test01 |    88 |     1 |
|  2 | stu01  |    99 |     2 |
|  3 | wangwu |    77 |     3 |
+----+--------+-------+-------+
3 rows in set (0.00 sec)

创建视图、多表相连查询

命令格式
① 创建视图

create view <视图名称>;

create view info_view as select id,name,age from info 条件;

(多表相连的条件是on、单表的条件是where)

② 查询视图

select * fom info_view;

select name,age from info_view;

示例

mysql> create view view_user as select u.name,h.hob_name from user u inner join hob h on u.hobby=h.id;
Query OK, 0 rows affected (0.00 sec)

mysql> select * fom view_user;
+--------+----------+
| name   | hob_name |
+--------+----------+
| test01 | read     |
| stu01  | running  |
| wangwu | game     |
+--------+----------+
4 rows in set (0.00 sec)
3.2.1 视图的特点
  • 安全性高
  • 简化sql操作
  • 可以针对不同用户创建不同的视图(不同权限的用户浏览不同的信息)
3.3 存储过程
3.3.1 存储过程概念
  • 存储过程:多用于软件开发

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

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

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

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

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

3.3.2 存储过程的优点

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

四、存储引擎

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

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

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

    MylSAM

    InnoDB

  • MySQL存储引擎是MySQL数据库服务器中的组件,负责数据库执行世纪的数据I/O操作

  • 使用特殊存储引擎的主要优点包括:

    仅需提供特殊应用所需的特性

    数据库中的系统开销较小

    具有更有效和更高的数据库性能

  • MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储
    在这里插入图片描述

  • 从程序开发角度考虑

    不同语言安装不同的驱动创建不同的connector

    connection pool中有多个对象(空闲的进程/线程)

    connector和connection pool的对象连接MySQL server

    连接池作用:优化连接效率

  • 从系统(物理)层面考虑

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

    在连接上之后,需要寻找数据,这些数据放在file system (管理工具,物理层面:磁盘、磁道、扇区上)NSS EST

  • 具体文件内容通过存储引擎存储在硬盘上,通过各种管理工具(Management Server)管理(权限、群集、备份还原管理等)
    privilege:特权
    parser:分析器
    query:查询
    optimizer:优化程序
    数据库的日志文件是数据库命脉,需要单独备份。

4.2 MylSAM
4.2.1 MylSAM介绍
  • MylSAM存储引擎是MySQL关系数据库系统5.5版本之前默认的存储引擎,前身是ISAM

  • ISAM是一个定义明确且经理时间考验的数据表格管理方法,在设计之时就考虑到数据库被查询的次数要远大于更新的次数

  • ISAM的特点

    ISAM执行读取操作的速度很快

    不支持事务处理

    不占用大量的内存和存储资源

    不能够容错

使用create table 创建时,默认使用的是MylSAM存储引擎

  • MylSAM管理非事务表,时ISAM的扩展格式
  • 提供ISAM里所没有的索引和字段管理的大量功能
  • MylSAM使用一种表格锁定的机制,以优化多个并发的读写操作
  • MylSAM提供高速存储和检索,以及全文搜索能力,收到web开发的青睐
4.2.2 MylSAM特点
  • 不支持事务

  • 表级锁定形式,数据在更新时锁定整个表

  • 数据库在读写过程中相互阻塞

    会在数据写入的过程阻塞用户数据的读取

    也会在数据读取额过程中阻塞用户的数据写入

  • 可通过key_buffer_size来设置缓存索引,提高访问性能,减少磁盘IO的压力

    但缓存只会缓存索引文件,不会缓存数据

  • 采用MylSAM存储引擎数据单独写入或读取,速度过程比较快且占用资源下个对少

  • MylSAM存储引擎不支持外键约束,只支持全文索引

  • 每个MylSAM在磁盘上存储成三个文件,每一个文件的名字以表的名字开始,扩展名指出文件类型

  • MylSAM在磁盘上存储的文件

    .frm文件存储表定义

    数据文件的扩展名为.MYD (MYData)

    索引文件的扩展名是.MYI (MYIndex)

4.2.3 MyISAM使用的生产场景
  • 公司业务不需要事务的支持
  • 一般单方面读取数据比较多的业务,或单方面写入数据比较多的业务
  • MyISAM存储引擎数据读写都比较频繁的场景不适合
  • 使用读写并发访问相对较低的业务
  • 数据修改相对较少的业务
  • 对数据业务一致性要求不是非常高的业务
  • 服务器硬件资源相对比较差
4.3 InnoDB特点
  • 支持事务:支持4个事务隔离级别
  • 行级锁定,但是全表扫描仍然会是表级锁定
  • 读写阻塞与事务隔离级别相关
  • 具有非常高效的缓存特性:能缓存索引,也能缓存数据
  • 表与主键以簇的方式存储
  • 支持分区、表空间,类似oracle数据库
  • 支持外键约束,5.5以前不支持全文索引,5.5版本以后支持全文索引
  • 对硬件资源要求还是比较高的场合
4.3.1 InnoDB 使用生产场景分析
  • 业务需要事务的支持
  • 行级锁定对高并发有很好的适应能力,但需要确保查询是通过索引来完成的
  • 业务数据更新较为频繁的场景,如:论坛,微博等
  • 业务数据一直习惯要求较高,例如:银行业务
  • 硬件设备内存较大, 利用Innodb较号的缓存能力来提高内存利用率,减少磁盘IO的压力
4.4 企业选择存储引擎依据
  • 需要考虑每个存储引擎提供了哪些不同的核心功能及应用场景

  • 支持的字段和数据类型

    索引引擎都支持通用的数据类型

    但不是索引的引擎都支持其他字段类型,如二进制对象

  • 锁定类型:不同的存储引擎支持不同级别的索引

    表锁定

    行锁定

  • 索引的支持

    建立索引在搜索和恢复数据库中的数据的时候能够显著提高性能

    不同的存储引擎提供不同的制作索引的技术

    有些存储引擎根本不支持索引

  • 事务处理的支持

    事务处理功能通过提供在向表中更新和插入信息器间的可靠性

    可根据企业业务是否要支持事务选择存储引擎

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

  • 修改步骤

    ① 查看数据库可配置的存储引擎

    ② 查看表正在使用的存储引擎

    ③ 配置存储引擎为所选择的类型

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

  • 查看表使用的存储引擎

    方法1 : show table status from 库名 where name=‘表名’;

    方法2 : show create table 表名;

    示例

方式一

mysql> show table status from school where name='info';
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| Name | Engine | Version | Row_format | Rows | Avg_row_length | Data_length | Max_data_length | Index_length | Data_free | Auto_increment | Create_time         | Update_time         | Check_time | Collation       | Checksum | Create_options | Comment |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
| info | InnoDB |      10 | Dynamic    |    2 |           8192 |       16384 |               0 |            0 |         0 |              3 | 2020-01-13 14:15:04 | 2020-01-13 14:25:49 | NULL       | utf8_general_ci |     NULL |                |         |
+------+--------+---------+------------+------+----------------+-------------+-----------------+--------------+-----------+----------------+---------------------+---------------------+------------+-----------------+----------+----------------+---------+
1 row in set (0.01 sec)

方式二

mysql> use school
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql> show create table info;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                            |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| info  | CREATE TABLE "info" (
  "ind" int(4) NOT NULL AUTO_INCREMENT,
  "name" varchar(10) NOT NULL,
  "address" varchar(50) DEFAULT 'nj',
  "age" int(3) NOT NULL,
  PRIMARY KEY ("ind")
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)
#info表存储引擎是InnoDB
4.5.1 修改存储引擎

方式一:alter table 修改

格式:alter table table_name engine=引擎;

示例

mysql> alter table info engine=myisam;
Query OK, 2 rows affected (0.05 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> show create table info;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                            |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| info  | CREATE TABLE "info" (
  "ind" int(4) NOT NULL AUTO_INCREMENT,
  "name" varchar(10) NOT NULL,
  "address" varchar(50) DEFAULT 'nj',
  "age" int(3) NOT NULL,
  PRIMARY KEY ("ind")
) ENGINE=MyISAM AUTO_INCREMENT=3 DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.01 sec)

mysql> 
#修改后 存储引擎改为myisqm

方式二修改my.cnf,指定默认存储引擎并重启服务

格式:default-storage-engine=InnoDB

示例
在这里插入图片描述保存退出后重启服务

systemctl stop mysqld
systemctl stop mysqld

方式三:create table 创建表时指定存储引擎

格式:create table engine Test(id int) engine=MyISAM;

示例

mysql> create table enginetest(id int) engine=myisam;
Query OK, 0 rows affected (0.01 sec)

mysql> show create table enginetest;
+------------+----------------------------------------------------------------------------------------------+
| Table      | Create Table                                                                                 |
+------------+----------------------------------------------------------------------------------------------+
| enginetest | CREATE TABLE "enginetest" (
  "id" int(11) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
+------------+----------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

方法四:Mysql_convert_table_format 转化存储引擎

格式:/usr/local/mysql/bin/mysql_convert_table_format --user=root --password=‘123123’ --sock=/tmp/mysql.sock auth --engine=myisam client info

[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=/tmp/mysql.sock auth

总结:

数据库中的sql语句无法进行补全,所以在输入时要注意字符、符号、空格的位置以及定义的类型是否有误,在日常操作过程中,对数据库需要进行定期备份与处理,之后的博客中将会对数据库备份进行介绍

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章