MySQL数据库索引、事务与存储引擎

数据库索引

一:索引的概念

索引是一个特殊的文件,包含着对数据表中所有记录的引用指针。更通俗的说,数据库索引好比是一本书前面的目录,能加快数据库的查询速度。例如需要遍历 200 条数据,在没有索引的情况下,数据库会遍历全部 200 条数据后选择符合条件的;而有了相应的索引之后,数据库会直接在索引中查找符合条件的选项。数据库索引就是为了提高表的搜索效率而对某些字段中的值建立的目录。

  • 是一个排序的列表,存储着索引值和这个值所对应的物理地址

  • 无须对整个表进行扫描,通过物理地址就可以找到所需数据

  • 是表中—列或者若干列值排序的方法

- 需要额外的磁盘空间

二:索引的作用

建立索引的目的是加快对表中记录的查找或排序。为表设置索引要付出代价:一是增加了数据库的存储空间,二是在插入和修改数据时要花费较多的时间(因为索引也要随之变动)。但是相比付出的代价,索引的作用显得更为重要:

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

三:索引的分类

MySQL 的索引分为以下几类:

  • (1)普通索引: 这是最基本的索引类型,而且它没有唯一性之类的限制

  • (2)唯一性索引:这种索引和前面的 “普通索引” 基本相同,但有一个区别:索引列的所有值只能出现一次,即必须唯一。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。

  • (3)主键索引:主键是一种唯一性索引,但它必须指定为 “PRIMARY KEY” 。在数据库中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。

  • (4)全文索引:索引类型为 FULLTEXT ,全文索引可以在 CHAR、VARCHAR 或者 TEXT 类型的列上创建。

  • (5)单列索引与多列索引:索引可以是单列上创建的索引,也可以是在多列上创建的索引。多列索引可以区分其中一列可能有相同值的行。如果经常同时搜索两列或多列或两列或多列排序时,索引也很有帮助。

四:创建索引的原则依据

索引可以提升数据库查询的速度,但并不是任何情况下都需要创建索引。因为索引本身会消耗系统资源,更重要的是在有索引的情况下,数据库查询会先进行索引查询,然后定位到具体的数据行,如果索引使用不当,反而会增加数据库的负担,下面列出了创建索引的原则依据。

  1. 表的主键、外键必须有索引。主键具有唯一性,索引值也是唯一的,查询时可以快速定位到数据行。外键一般关联的是另一个表的主键,所以在多表查询时也可以快速定位。
  2. 数据量超过 300 行的表应该有索引。数据量较大时,如果没有索引,需要把表遍历一遍,严重影响数据库的性能。
  3. 经常与其他表进行表连接的表,在连接字段上应该建立索引。
  4. 唯一性太差的字段不适合建立索引。如果索引字段的数据唯一性太差,是不适合创建的。
  5. 更新太频繁的字段不适合创建索引。在表中进行增加、删除、修改操作时,索引也有相应操作产生。字段更新过于频繁,对于系统资源占用也会更多。
  6. 经常出现在 Where 子句中的字段,特别是大表的字段,应该建立索引。
  7. 索引应该建在选择性高的字段上。如果很少的字段拥有相同值,即有很多独特值,则选择性很高。
  8. 索引应该建在小字段上,对于大的文本字段甚至超长字段,不要建立索引。

五:索引的具体操作

1:普通索引

命令格式:CREATE INDEX <索引的名字> ON tablename (列的列表)

(1)创建索引

以这表为例,选取某一项创建索引

mysql> desc vvv;
+--------+--------------+------+-----+---------+-------+
| Field  | Type         | Null | Key | Default | Extra |
+--------+--------------+------+-----+---------+-------+
| name   | varchar(128) | NO   |     | NULL    |       |
| age    | int(3)       | YES  |     | NULL    |       |
| height | int(3)       | NO   |     | NULL    |       |
+--------+--------------+------+-----+---------+-------+

以年龄和名字这两项创建索引

mysql> create index putong on vvv(age);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> create index putong1 on vvv(name);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

查看索引

mysql> show index from vvv\G;
*************************** 1. row ***************************
        Table: vvv
   Non_unique: 1
     Key_name: putong
 Seq_in_index: 1
  Column_name: age
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: vvv
   Non_unique: 1
     Key_name: putong1
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

ERROR: 
No query specified

(2)删除索引再查看

mysql> drop index putong1 on vvv;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

ysql> show index from vvv\G;
*************************** 1. row ***************************
        Table: vvv
   Non_unique: 1
     Key_name: putong
 Seq_in_index: 1
  Column_name: age
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

ERROR: 
No query specified

(3)修改表时添加索引再查看

mysql> alter table vvv add index putong3(height);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show index from vvv\G;
*************************** 1. row ***************************
        Table: vvv
   Non_unique: 1
     Key_name: putong
 Seq_in_index: 1
  Column_name: age
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: vvv
   Non_unique: 1
     Key_name: putong3
 Seq_in_index: 1
  Column_name: height
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

ERROR: 
No query specified

(4)创建表时添加索引再查看

mysql> create table stu(num int(6) not null primary key, name varchar(64) not null, 
age int(3) not null, index putong5(name));
Query OK, 0 rows affected (0.01 sec)

mysql> mysql> show ind stu\G;
*************************** 1. row ***************************
        Table: stu
   Non_unique: 0
     Key_name: PRIMARY
 Seq_in_index: 1
  Column_name: num
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: stu
   Non_unique: 1
     Key_name: putong5
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: 
   Index_type: BTREE
      Comment: 
Index_comment: 
2 rows in set (0.00 sec)

ERROR: 
No query specified

2:唯一索引

命令格式:CREATE UNIQUE INDEX <索引的名字> ON tablename (列的列表)

第一种创建方式

  • 重新创建一个表创建唯一索引
mysql> create table xinxi(num int(6) not null primary key, name varchar(64) not null, age int(3) not null, index putong5(name));
Query OK, 0 rows affected (0.01 sec)

mysql> insert into xinxi values(001,'zhangsan',16),(002,'lisi',17),(003,'lisi',18),(004,'wangwu',18);             
Query OK, 4 rows affected (0.00 sec)
Records: 4  Duplicates: 0  Warnings: 0

mysql> select * from xinxi;
+-----+----------+-----+
| num | name     | age |
+-----+----------+-----+
|   1 | zhangsan |  16 |
|   2 | lisi     |  17 |
|   3 | lisi     |  18 |
|   4 | wangwu   |  18 |
+-----+----------+-----+
4 rows in set (0.00 sec)
  • 创建唯一索引

由于名字和年龄都有重复的数据,所以无法创建唯一索引

ERROR 1062 (23000): Duplicate entry 'lisi' for key 'one'
mysql> create unique index one on xinxi(age);
ERROR 1062 (23000): Duplicate entry '18' for key 'one'

num中没有重复的数据,所以可以创建唯一索引

mysql> create unique index one on xinxi(num);
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

第二种创建方式

  • 先删除之前创建的唯一索引
mysql> drop index one on xinxi;
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0
  • 修改时创建唯一索引
mysql> alter table xinxi add unique two(num);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

第三种创建方式

  • 重新创建新表时添加唯一性索引
mysql> create table dog(id int(6),dog_name varchar(64),sta int(1),unique id(id));
Query OK, 0 rows affected (0.00 sec)

mysql> desc dog;
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(6)      | YES  | UNI | NULL    |       |
| dog_name | varchar(64) | YES  |     | NULL    |       |
| sta      | int(1)      | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)
  • 查看索引
ysql> show index from dog\G;
*************************** 1. row ***************************
        Table: dog
   Non_unique: 0
     Key_name: id
 Seq_in_index: 1
  Column_name: id
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
1 row in set (0.00 sec)

ERROR: 
No query specified

3:主键索引

  • 用此表创建主键索引
+----------+-------------+------+-----+---------+-------+
| Field    | Type        | Null | Key | Default | Extra |
+----------+-------------+------+-----+---------+-------+
| id       | int(6)      | YES  | UNI | NULL    |       |
| dog_name | varchar(64) | YES  |     | NULL    |       |
| sta      | int(1)      | YES  |     | NULL    |       |
+----------+-------------+------+-----+---------+-------+
mysql> insert into dog(dog_name,sta) values('xiaohei',0);
Query OK, 1 row affected (0.00 sec)

mysql> select * from dog;
+------+----------+------+
| id   | dog_name | sta  |
+------+----------+------+
| NULL | xiaohei  |    0 |
+------+----------+------+
1 row in set (0.00 sec)

4:单列索引与多列索引

  • 创建新表
mysql> create table user(name varchar(64),age int(3),sex tinyint(1),index user(name,age,sex));
Query OK, 0 rows affected (0.00 sec)
  • 查看索引
mysql> show index from user\G;
*************************** 1. row ***************************
        Table: user
   Non_unique: 1
     Key_name: user
 Seq_in_index: 1
  Column_name: name
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 2. row ***************************
        Table: user
   Non_unique: 1
     Key_name: user
 Seq_in_index: 2
  Column_name: age
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
*************************** 3. row ***************************
        Table: user
   Non_unique: 1
     Key_name: user
 Seq_in_index: 3
  Column_name: sex
    Collation: A
  Cardinality: 0
     Sub_part: NULL
       Packed: NULL
         Null: YES
   Index_type: BTREE
      Comment: 
Index_comment: 
3 rows in set (0.00 sec)

ERROR: 
No query specified

5:全文索引

  • 以此表创建全文索引
mysql> desc user;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| name  | varchar(64) | YES  | MUL | NULL    |       |
| age   | int(3)      | YES  |     | NULL    |       |
| sex   | tinyint(1)  | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
mysql> create fulltext index full on user(name(64));
Query OK, 0 rows affected, 1 warning (0.02 sec)
Records: 0  Duplicates: 0  Warnings: 1

事务的概念及特点

一:事务的概念

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

二:事务的ACID特点

事务具体由四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(lsolation)、持久性(Durability)

原子性(Atomicity)

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

一致性(Consistency)

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

隔离性(lsolation)

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

持久性(Durability)

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

三:事务控制语句

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

2:事务控制语句

  • BEGIN或START TRANSACTION > 开始一个事务
  • COMMIT > 提交
  • ROLLBACK > 回滚
  • SAVEPOINT identifier > 创建保存点
  • RELEASE SAVEPOINT identifier > 删除保存点
  • ROLLBACK TO identifier> 回滚到指定保存点
  • SET TRANSACTION> 设置事务的隔离级别

事务的控制方法

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

事务处理命令控制事务

  • bebin:开始一个事务,后面会有多条数据库操作语句执行
  • commit:提交一个事务,对应前面的 begin 操作,他们之间的数据库操作语句一起完成
  • rollback:回滚一个事务使用,在 begin 和 commit 之间,如果某一个数据库操作语句出现错误,执行 rollback 回滚,数据库回到 begin 之前的状态,也就是操作语句都没执行

2:使用set命令进行控制

  • set autocommit=0:禁止自动提交
  • set autocommit=1:开启自动提交

(1)自动提交默认为开启状态

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.02 sec)

(2)关闭自动默认提交

mysql> set autocommit=0;
Query OK, 0 rows affected (0.01 sec)

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | OFF   |
+---------------+-------+
1 row in set (0.01 sec)

每次重新连接数据库的时候,自动默认提交都处于开启状态

手动事务操作

以此表为例

1:第一种操作

+-----+----------+-----+
| num | name     | age |
+-----+----------+-----+
|   1 | zhangsan |  16 |
|   2 | lisi     |  17 |
|   3 | lisi     |  18 |
|   4 | wangwu   |  18 |
+-----+----------+-----+
  • 开始一个事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
  • 删除一个数据
mysql> delete from stu where num=1;
Query OK, 1 row affected (0.00 sec)

mysql> select * from stu;
+-----+--------+-----+
| num | name   | age |
+-----+--------+-----+
|   2 | lisi   |  17 |
|   3 | lisi   |  18 |
|   4 | wangwu |  18 |
+-----+--------+-----+
3 rows in set (0.00 sec)
  • 重新建立新的相同的会话查看数据有没有被提交

此时数据并没有被提交

mysql> select * from stu;
+-----+----------+-----+
| num | name     | age |
+-----+----------+-----+
|   1 | zhangsan |  16 |
|   2 | lisi     |  17 |
|   3 | lisi     |  18 |
|   4 | wangwu   |  18 |
+-----+----------+-----+
4 rows in set (0.00 sec)
  • 进行回滚操作

被删除的数据又被恢复

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

mysql> select * from stu;
+-----+----------+-----+
| num | name     | age |
+-----+----------+-----+
|   1 | zhangsan |  16 |
|   2 | lisi     |  17 |
|   3 | lisi     |  18 |
|   4 | wangwu   |  18 |
+-----+----------+-----+
4 rows in set (0.00 sec)
  • 提交事务

提交之后,两边数据都是一样的

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

mysql> select * from stu;
+-----+----------+-----+
| num | name     | age |
+-----+----------+-----+
|   1 | zhangsan |  16 |
|   2 | lisi     |  17 |
|   3 | lisi     |  18 |
|   4 | wangwu   |  18 |
+-----+----------+-----+
4 rows in set (0.00 sec)

2:第二种操作

同样以此表为例进行事务操作

+-----+----------+-----+
| num | name     | age |
+-----+----------+-----+
|   1 | zhangsan |  16 |
|   2 | lisi     |  17 |
|   3 | lisi     |  18 |
|   4 | wangwu   |  18 |
+-----+----------+-----+
  • 开始一个事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
  • 删除某一项数据
mysql> delete from stu where num=1;
Query OK, 1 row affected (0.01 sec)

mysql> select * from stu;
+-----+--------+-----+
| num | name   | age |
+-----+--------+-----+
|   2 | lisi   |  17 |
|   3 | lisi   |  18 |
|   4 | wangwu |  18 |
+-----+--------+-----+
3 rows in set (0.00 sec)
  • 直接提交事务
mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from stu;
+-----+--------+-----+
| num | name   | age |
+-----+--------+-----+
|   2 | lisi   |  17 |
|   3 | lisi   |  18 |
|   4 | wangwu |  18 |
+-----+--------+-----+
3 rows in set (0.00 sec)

3:第三种操作

以此表为例

+-----+--------+-----+
| num | name   | age |
+-----+--------+-----+
|   2 | lisi   |  17 |
|   3 | lisi   |  18 |
|   4 | wangwu |  18 |
+-----+--------+-----+
  • 开始一个事务
mysql> begin;
Query OK, 0 rows affected (0.00 sec)
  • 添加一项数据

此时并没有提交事务

mysql> insert into stu values(5,'dahuang',20);
Query OK, 1 row affected (0.00 sec)
  • 断开连接再重新连接
mysql> exit
Bye
[root@server4 ~]# mysql -uroot -p123123
  • 进入数据库添加任务

此时并没有提交任务已经生成数据

mysql> insert into aaa.stu values(5,'dahuang',20);
Query OK, 1 row affected (0.00 sec)

mysql> select * from aaa.stu;
+-----+---------+-----+
| num | name    | age |
+-----+---------+-----+
|   2 | lisi    |  17 |
|   3 | lisi    |  18 |
|   4 | wangwu  |  18 |
|   5 | dahuang |  20 |
+-----+---------+-----+
4 rows in set (0.00 sec)

每次重新连接数据库的时候,自动默认提交都处于开启状态

存储引擎概

一:存储引擎概念介绍

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

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

3: MySQL常用的存储引擎

  • MyISAM
  • lnnoDB

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

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

二:MyISAM的介绍及特点

1:MyISAM不支持事务,也不支持外键

2:访问速度快

3:对事务完整性没有要求

4:MyISAM在磁盘上存储成三个文件

  • .frm文件存储表定义数
  • 据文件的扩展名为.MYD (MYData)
  • 索引文件的扩展名是.MYI (MYIndex)

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

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

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

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

8:MyIAM支持的存储格式

  • 静态表
  • 动态表
  • 压缩表

存储格式解释

  • 静态表:静态表是默认的存储格式。静态表中的字段都是非可变字段,这样每个记录都是固定长度的,这种存储方式的优点是存储非常迅速,容易缓存,出现故障容易恢复;缺点是占用的空间通常比动态表多。静态表在数据存储时会根据列定义的宽度定义补足空格,但是在访问的时候并不会得到这些空格,这些空格在返回给应用之前已经去掉。同时需要注意:在某些情况下可能需要返回字段后的空格,而使用这种格式时后面的空格会被自动处理掉。
  • 动态表:动态表包含可变字段,记录不是固定长度的,这样存储的优点是占用空间较少,但是频繁的更新、删除记录会产生碎片,需要定期执行OPTIMIZE
    TABLE 语句或myisamchk -r命令来改善性能,并且出现故障的时候恢复相对比较困难。
  • 压缩表:压缩表由myisamchk工具创建,占据非常小的空间,因为每条记录都是被单独压缩的,所以只有非常小的访问开支。

三:MyISAM适用的生产场景

1:公司业务不需要事务的支持

2:单方面读取或写入数据比较多的业务

3:MylSAM存储引擎数据读写都比较频繁场景不适合

4:使用读写并发访问相对较低的业务

5:数据修改相对较少的业务

6:对数据业务一致性要求不是非常高的业务

7:服务器硬件资源相对比较差

四:lnnoDB特点介绍

1:支持4个事务隔离级别

2:行级锁定但是全表扫描仍然会是表级锁定

3:读写阻塞与事务隔离级别相关

4:能非常高效的缓存索引和数据

5:表与主键以簇的方式存储

6:支持分区、表空间,类似oracle数据库

7:支持外键约束,5.5前不支持全文索引,5.5后支持全文索引

8:对硬件资源要求还是比较高的场合

部分注释

  1. 分区:就是把一张表的数据分成N个区块,在逻辑上看最终只是一张表,但底层是由N个物理区块组成的
  2. 分表:就是把一张表按一定的规则分解成N个具有独立存储空间的实体表。系统读写时需要根据定义好的规则得到对应的字表明,然后操作它
  3. 分库:一旦分表,一个库中的表会越来越多
  4. 表空间是数据库的逻辑划分,一个表空间只能属于一个数据库。所有的数据库对象都存放在指定的表空间中。但主要存放的是表,所以称作表空间

一个数据库可以包含多个表空间,一个表空间只能属于一个数据库

一个表空间包含多个数据文件,一个数据文件只能属于一个表空间

五:lnnoDB适用生产场景

1:业务需要事务的支持

2:行级锁定对高并发有很好的适应能力,但需确保查询是通过索引来完成

3:业务数据更新较为频繁的场景,如:论坛,微博等

4:业务数据、致性要求较高,如:银行业务

5:硬件设备内存较大,利用lnnodb较好的缓存能力来提高内存利用率,减少磁盘IO的压力

六:企业选择存储引擎依据

1:需要考虑每个存储引擎提供的核心功能及应用场景

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

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

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

  • 表锁定
  • 行锁定

4:索引的支持

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

5:事务处理的支持

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

七:修改存储引擎

方法1: alter table修改

alter table table_name engine=|;

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

default-storage-engine=lnnoDB

方法3: create table创建表时指定存储引擎

create table表名 (字段) engine = 引擎

八:具体修改操作示例

查看当前支持的引擎

mysql> show engines\G;
*************************** 1. row ***************************
      Engine: InnoDB
     Support: DEFAULT
     Comment: Supports transactions, row-level locking, and foreign keys
Transactions: YES
          XA: YES
  Savepoints: YES
*************************** 2. row ***************************
      Engine: MRG_MYISAM
     Support: YES
     Comment: Collection of identical MyISAM tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 3. row ***************************
      Engine: MEMORY
     Support: YES
     Comment: Hash based, stored in memory, useful for temporary tables
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 4. row ***************************
      Engine: BLACKHOLE
     Support: YES
     Comment: /dev/null storage engine (anything you write to it disappears)
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 5. row ***************************
      Engine: MyISAM
     Support: YES
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 6. row ***************************
      Engine: CSV
     Support: YES
     Comment: CSV storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 7. row ***************************
      Engine: ARCHIVE
     Support: YES
     Comment: Archive storage engine
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 8. row ***************************
      Engine: PERFORMANCE_SCHEMA
     Support: YES
     Comment: Performance Schema
Transactions: NO
          XA: NO
  Savepoints: NO
*************************** 9. row ***************************
      Engine: FEDERATED
     Support: NO
     Comment: Federated MySQL storage engine
Transactions: NULL
          XA: NULL
  Savepoints: NULL
9 rows in set (0.00 sec)

1:第一种修改引擎

  • 查看一个存储引擎
mysql> show create table stu\G;
*************************** 1. row ***************************
       Table: stu
Create Table: CREATE TABLE "stu" (
  "num" int(6) NOT NULL,
  "name" varchar(64) NOT NULL,
  "age" int(3) NOT NULL,
  PRIMARY KEY ("num"),
  KEY "putong5" ("name")
) ENGINE=InnoDB DEFAULT CHARSET=utf8            #存储引擎为:InnoDB
1 row in set (0.00 sec)
  • 修改存储引擎
mysql> alter table stu engine=MyISAM;
Query OK, 4 rows affected (0.02 sec)
Records: 4  Duplicates: 0  Warnings: 0

修改完后查看

mysql> show create table stu\G;
*************************** 1. row ***************************
       Table: stu
Create Table: CREATE TABLE "stu" (
  "num" int(6) NOT NULL,
  "name" varchar(64) NOT NULL,
  "age" int(3) NOT NULL,
  PRIMARY KEY ("num"),
  KEY "putong5" ("name")
) ENGINE=MyISAM DEFAULT CHARSET=utf8                   #存储引擎为:MyISAM
1 row in set (0.00 sec)

2:第二种修改引擎

  • 退出数据库进入配置文件修改默认引擎
mysql> exit
Bye
[root@server4 ~]# vi /etc/my.cnf
default-storage-engine=MyISAM            #添加
  • 重启数据库
[root@server4 ~]# systemctl restart mysqld
  • 登录数据库进行查看
[root@server4 ~]# mysql -uroot -p123123

mysql> show engines\G;

*************************** 5. row ***************************
      Engine: MyISAM
     Support: DEFAULT
     Comment: MyISAM storage engine
Transactions: NO
          XA: NO
  Savepoints: NO

3:第三种修改引擎

  • create table 创建表时指定存储引擎

指定引擎

mysql> create table aaa.pp(id int(1)) engine=InnoDB;
Query OK, 0 rows affected (0.00 sec)

不指定引擎

mysql> create table aaa.qq(id int(1));
Query OK, 0 rows affected (0.00 sec)
  • 查看引擎
mysql> show create table aaa.pp\G;
*************************** 1. row ***************************
       Table: pp
Create Table: CREATE TABLE "pp" (
  "id" int(1) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8              #指定为;InnoDB
1 row in set (0.11 sec)
mysql> show create table aaa.qq\G;
*************************** 1. row ***************************
       Table: qq
Create Table: CREATE TABLE "qq" (
  "id" int(1) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8              #系统默认:MyISAM
1 row in set (0.00 sec)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值