MySQL:指定索引+事务+存储引擎的配置 开发必备 天呐!为什么会有索引这种东西

来来来,我告诉你为什么要有索引

  • 索引的概念
      • 索引的作用
  • 索引的分类
      • 普通索引创建的三种方式与删除
      • 创建唯一索引与创建的三种方式
      • 主键索引与创建的两种方式
      • 组合索引
      • 全文索引
      • 创建索引的原则依据
  • 事务的概念
      • 事务的ACID特点
      • 事务控制语句
      • Mysql事务处理两种方法实列
  • 存储引擎的概念
      • 常用存储引擎MylSAM
      • 常用存储引擎lnnoDB
      • 企业选存储引擎的依据
      • 修改存储引擎

索引的概念

数据库索引
是一个排序的列表,存储着索引值和这个值所对应的物理地址
无须对整个表进行扫描,通过物理地址就可以找到所需数据
是表中一列或者若干列值排序的方法
需要额外的磁盘空间
讲一个现实的小故事:一早上你去医院排队,前面一共站了6个人,医护人员每搜索一个人的名字,数据库就全盘搜索一遍,不多也就10-20分钟,请问,排你的时候过去了多久
再讲一个小故事:你家住16楼,没有电梯索引,请问,在不考虑体力透支的情下,一层楼你需要爬2分钟,那么你从楼底到你家一共爬了多少分钟

索引的作用

数据库利用各种快速定位技术,能够大大加快查询速率
当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度
可以降低数据库的IO成本,并且还可以降低数据库的排序成本
通过创建唯一性索引保证数据表数据的唯一性
可以加快表与表之间的连接
在使用分组和排序时,可大大减少分组和排序时间

索引的分类

普通索引创建的三种方式与删除

最基本的索引类型,没有唯一性之类的限制

先搭建环境,然后演示普通索引的创建方式:
普通索引创建有三种方式:

(1) 用index直接创建

#第一步,搭建环境

mysql> show databases;                    ##查看数据库
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| sys                |
+--------------------+
4 rows in set (0.00 sec)

mysql> create database school;               创建school数据库
Query OK, 1 row affected (0.00 sec)

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

mysql> use school                  进入school数据库
Database changed

mysql> create table info (
    -> id int(4) not null primary key auto_increment,
    -> name varchar(10) not null,
    -> address varchar(50) default 'nanjing',
    -> age int(3) not null);
Query OK, 0 rows affected (0.00 sec)

#创建表
代码: 解释:
primary key 指定id为主键索引
auto_increment 自增
varchar(10) 数字表示给多大空间
int(4) 同样表示给多大空间
not null 表示不能为空

#接下来向info表中添加数据
mysql> insert into info (name,address,age) values ('zhangsan','beijing',20),('lisi','shanghai',22);

mysql> select * from info;            查看表中数据
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
+----+----------+----------+-----+
2 rows in set (0.01 sec)

mysql> describe info;               查看表结构
+---------+-------------+------+-----+---------+----------------+
| Field   | Type        | Null | Key | Default | Extra          |
+---------+-------------+------+-----+---------+----------------+
| id      | int(4)      | NO   | PRI | NULL    | auto_increment |
| name    | varchar(10) | NO   |     | NULL    |                |
| address | varchar(50) | YES  |     | nanjing |                |
| age     | int(3)      | NO   |     | NULL    |                |
+---------+-------------+------+-----+---------+----------------+
4 rows in set (0.00 sec)

咳咳,敲代码的我很严肃,绝不对打哈哈
接下来开始创建普通索引

针对info表中,age创建索引

#代码有点长,可以跟我一起做,方便自己查看

mysql> create index index_age on info (age);	针对info表中,age创建索引
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from info;			发现 info  |          1 | index_age |            1 | age        创建索引
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          1 | index_age |            1 | age         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+


#有创建必有删除

mysql> drop index index_age on info;		删除索引
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

(2)用alter修改表方式创建普通索引

mysql> alter table info add index index_age (age);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          1 | index_age |            1 | age         | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

mysql> drop index index_age on info;		删除索引

(3)创建表时就创建普通索引

敲的我好苦逼,要换电脑了,这个上下键着实让我难以平静
mysql>  create table zz (
    -> id int(5) not null primary key auto_increment,
    ->  name varchar(10) not null,
    -> score decimal not null,
    ->  hobby int(2) not null default '1',
    -> index index_sc (score));     
Query OK, 0 rows affected (0.01 sec)

mysql> show index from zz;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| zz    |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| zz    |          1 | index_sc |            1 | score       | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

创建唯一索引与创建的三种方式

唯一性索引:
与“普通索引”基本相同
与普通索引的区别是索引列的所有值只能出现一次,即必须唯一
同样,创建唯一索引也有三种方式

(1)用create unique方法,创建唯一索引

#先将原来的索引全部删除
mysql> show index from info;

mysql> drop index index_sc on zz;        

mysql> show index from zz;

#下面开始创建

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;
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| 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 | id          | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
| info  |          0 | unique_name |            1 | name        | A         |           2 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+-------------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)


mysql>  drop index unique_name on info;      删除
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

(2)使用alter table方法创建唯一索引

mysql> alter table info add unique index_name (name);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

(3)使用新建表的方法创建唯一索引

mysql> create table user1 (
    -> 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 unique_name (name));

mysql> drop index unique_name on user1;    删除
有同学看到这里不淡定了,怎么这么烦啊,这么多方式,给个面子淡定淡定
三种方式定义:
1、创建表的时候直接定义
2、create index 索引名称 on 表命 (列名1,列名2);或者create unique index 索引名称 on 表命 (列名1,列名2);
3、alter table 表命 add index 索引名称 (列名);或者alter table 表命 add unique 索引名称 (列名);

主键索引与创建的两种方式

主键索引:
一个表只能有一个主键,不允许有空值
是一种特殊的唯一索引,指定为“PRIMARY KEY"
同样有着两种方式

(1)末尾指定创建方式:

mysql> create table user2 (
    -> id int(4) not null  auto_increment,
    -> name varchar(10) not null,
    -> age int(3) not null,
    -> primary key (`id`));

mysql> show index from user2;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user2 |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
1 row in set (0.00 sec)

(2)直接在行中指定创建方式:

#先删除所有表
mysql> drop table school.user1;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table school.info;
Query OK, 0 rows affected (0.00 sec)

mysql> drop table school.zz;
Query OK, 0 rows affected (0.01 sec)

接下来创建:

mysql>  create table zz (
    -> id int(5) not null primary key auto_increment,
    -> name varchar(10) not null,
    -> score decimal not null,
    -> index index_scrore (score));

Query OK, 0 rows affected (0.01 sec)
Query OK, 0 rows affected (0.01 sec)

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


#可以看到我在第二行就已经指定主键为id了

组合索引

组合索引(单列索引与多列索引):
可以是单列上创建的索引,也可以是在多列上创建的索引
最左原则,从左往右依次执行

(1)创建方式

mysql> create table user3 (
    -> name varchar(10) not null,
    -> age int(3) not null,
    -> sex tinyint(1) not null,
    -> index user3(name,age,sex));


####查看组合索引,发现keyname统统是一样的####
mysql> show keys from user3;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user3 |          1 | user3    |            1 | name        | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| user3 |          1 | user3    |            2 | age         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| user3 |          1 | user3    |            3 | sex         | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
3 rows in set (0.00 sec)

全文索引

全文索引:
MySQL从3.23.23版开始支持全文索引和全文检索
索引类型为FULLTEXT
可以在CHAR、VARCHAR或者TEXT类型的列上创建

(1)创建方式

mysql> create table user4 (
    -> id int(11) not null auto_increment,
    -> tile char(255) character set utf8 collate utf8_general_ci not null,
    -> content text character set utf8 collate utf8_general_ci not null,
    -> primary key (`id`),
    -> fulltext (content));
Query OK, 0 rows affected (0.04 sec)


mysql> show keys from user4;
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| user4 |          0 | PRIMARY  |            1 | id          | A         |           0 |     NULL | NULL   |      | BTREE      |         |               |
| user4 |          1 | content  |            1 | content     | NULL      |           0 |     NULL | NULL   |      | FULLTEXT   |         |               |
+-------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
2 rows in set (0.00 sec)

创建索引的原则依据

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

事务的概念

小葵妈妈故事课堂又开课了:假如你今天参加聚会,就因为多喝了点酒,结果误了晚上女友交代的事情,被一顿臭骂,那么以下选择你会选哪个?
A:把你女朋友打一顿,然后分手
B:使用月光宝盒回到喝完酒后,然后去办理事情
C:当然选B
D:不选B你想啥呢

咳咳,不要瞎想了回正题
事务就像月光宝盒:
是一种机制、一个操作序列,包含了一组数据库操作命令,并且把所有的命令作为一个整体一起向系统提交或撤销操作请求,即这一组数据库命令要么都执行,要么都不执行
是个不可分割的工作逻辑单元,在数据库系统上执行并发操作时,事务是最小的控制单元
适用于多用户同时操作的数据库系统的场景,如银行,保险公司及证券交易系统等等
通过事务的整体性以保证数据的一致性

事务的ACID特点

●原子性(Atomicity):
事务是一个完整的操作,事务的各元素是不可分的
事务中的所有元素必须作为一个整体提交或回滚
如果事务中的任何元素失败,则整个事务将失败
●—致性(Consistency):
当事务完成时,数据必须处于一致状态
在事务开始前,数据库中存储的数据处于一致状态
在正在进行的事务中,数据可能处于不一致的状态
当事务成功完成时,数据必须再次回到已知的
●隔离性(lsolation)
对数据进行修改的所有并发事务是彼此隔离的,表明事务必须是独立的,它不应以任何方式依赖于或影响其他事务
修改数据的事务可在另一个使用相同数据的事务开始之前访问这些数据,或者在另一个使用相同数据的事务结束之后访问这些数据
●持久性(Durability)
指不管系统是否发生故障,事务处理的结果都是永久的
—旦事务被提交,事务的效果会被永久地保留在数据库中

事务控制语句

MySQL事务默认是自动提交的,当SQL语句提交时事务便自动提交

事务控制语句:
BEGIN 或 START TRANSACTION: 显式地开启一个事务:
COMMIT: 也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改变为永久性的
ROLLBACK: 又可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改
SAVEPOINT identifier: SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT:
RELEASE SAVEPOINT identifier: 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常
ROLLBACK TO identifier: 把事务回滚到标记点
SET TRANSACTION: 用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ等

Mysql事务处理两种方法实列

咳咳,允许我搭建个环境,可以跟我一起做
#环境搭建
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mysql              |
| performance_schema |
| school             |
| sys                |
+--------------------+
5 rows in set (0.00 sec)

mysql> use school;
mysql> show tables;
+------------------+
| Tables_in_school |
+------------------+
| zz               |
+------------------+
1 row in set (0.00 sec)

mysql>  create table info (
    -> id int(4) not null primary key auto_increment,
    -> name varchar(10) not null,
    -> address varchar(50) default 'nanjing',
    -> age int(3) not null);
Query OK, 0 rows affected (0.00 sec)

mysql>  insert into info (name,address,age) values ('zhangsan','beijing',20),('lisi','shanghai',22);

mysql> select * from info;                  记住下面的内容!!
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
+----+----------+----------+-----+
2 rows in set (0.00 sec)

(1)用BEGIN,ROLLBACK,COMMIT来实现

mysql>begin;			###开始事务

mysql> insert into info(name,address,age) values('wangwu','hainan',15);
Query OK, 1 row affected (0.00 sec)

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hainan   |  15 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)


mysql> savepoint a;                        创建月光宝盒a通道点
Query OK, 0 rows affected (0.00 sec)

mysql> insert into info(name,address,age) values('zhaoliu','xianggang',25);
Query OK, 1 row affected (0.00 sec)

mysql> select * from school.info;          新增数据后再次查看
+----+----------+-----------+-----+
| id | name     | address   | age |
+----+----------+-----------+-----+
|  1 | zhangsan | beijing   |  20 |
|  2 | lisi     | shanghai  |  22 |
|  3 | wangwu   | hainan    |  15 |
|  4 | zhaoliu  | xianggang |  25 |
+----+----------+-----------+-----+
4 rows in set (0.00 sec)

这个时候我们先不提交,用另外的终端打开主机,并查看school库中的情况

MySQL:指定索引+事务+存储引擎的配置 开发必备 天呐!为什么会有索引这种东西_第1张图片
只能看到事务开始之前的信息,接下来我们做回滚与提交!

mysql> rollback to a;                     使用月光宝盒a通道回到过去
Query OK, 0 rows affected (0.00 sec)

mysql> select * from info;
+----+----------+----------+-----+
| id | name     | address  | age |
+----+----------+----------+-----+
|  1 | zhangsan | beijing  |  20 |
|  2 | lisi     | shanghai |  22 |
|  3 | wangwu   | hainan   |  15 |
+----+----------+----------+-----+
3 rows in set (0.00 sec)

mysql>commit;			                     ###提交事务

再次使用另外的终端打开主机,并查看school库中的情况
MySQL:指定索引+事务+存储引擎的配置 开发必备 天呐!为什么会有索引这种东西_第2张图片
好的,月光宝盒使用成功

(2)直接用 SET 来改变 MySQL的自动提交模式

#SETAUTOCOMMIT=O禁止自动提交

#SETAUTOCOMMIT=1开启自动提交

存储引擎的概念

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

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

●MySQL常用的存储引擎
MylSAM
lnnoDB

呃…是不是有同学没看懂,那我讲个小故事好吧:
夜里你在睡觉,想翻个身,用腿翻身叫A引擎,用胳膊翻身叫B引擎
用什么方式翻身是你大脑记忆的存储方式或者存储格式!!
常用的翻身技巧:腿,胳膊
哈哈哈哈,讲完故事我人都傻了,你还不懂我没招了

●MySQL数据库中的组件,负责执行实际的数据I/O操作

●MySQL系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行存储

常用存储引擎MylSAM

■(1)MylSAM介绍

●MyISAM不支持事务,也不支持外键

●访问速度快

●对事务完整性没有要求

MyISAM在磁盘上存储成三个文件:
.frm文件存储表定义
数据文件的扩展名为.MYD (MYData)
索引文件的扩展名是.MYI (MYIndex)

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

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

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

●数据单独写入或读取,速度过程较快且占用资源相对少

●MyIAM支持的存储格式:

静态表
动态表
压缩表

■(2)MyISAM适用的生产场景举例

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

常用存储引擎lnnoDB

■(1)InnoDB特点介绍:

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

■(2)lnnoDB适用生产场景分析

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

企业选存储引擎的依据

■需要考虑每个存诸引擎提共的核心功能及应用场景

■支持的字段和数据类型:

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

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

表锁定
行锁定

■索引的支持

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

■事务处理的支持:

提高在向表中更新和插入信息期间的可靠性
可根据企业业务是否要支持事务选择存储引擎

修改存储引擎

mysql> show engines;            #查看存储引擎情况
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

#DEFAULT即为默认引擎
###修改表的存储引擎###
mysql> alter table info engine=MyISAM;


###查看表存储引擎###
mysql> show create table info \G
*************************** 1. row ***************************
       Table: info
Create Table: CREATE TABLE "info" (
  "id" int(4) NOT NULL AUTO_INCREMENT,
  "name" varchar(10) NOT NULL,
  "address" varchar(50) DEFAULT 'nanjing',
  "age" int(3) NOT NULL,
  PRIMARY KEY ("id"),
  UNIQUE KEY "index_name" ("name")
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)
##修改默认引擎####
vi /etc/my.cnf
default-storage-engine=MyISAM

systemctl restart mysqld

mysql> show variables like '%storage_engine%';
+----------------------------------+--------+
| Variable_name                    | Value  |
+----------------------------------+--------+
| default_storage_engine           | MyISAM |
| default_tmp_storage_engine       | InnoDB |
| disabled_storage_engines         |        |
| internal_tmp_disk_storage_engine | InnoDB |
+----------------------------------+--------+
4 rows in set (0.01 sec)
#通过 Mysql_convert_table_format 转化存储引擎。

[root@Mysql /]# yum -y install perl-DBI perl-DBD-MySQL

[root@Mysql/]# /usr/local/mysql/bin/mysql_convert_table_format --user=root --password='123456' --sock=/tmp/mysql.sock auth

你可能感兴趣的:(云计算,mysql)