目录

MySQL引擎概述

1 MySAM引擎介绍

2 什么是InnoDB引擎?

3 生产环境中如何批量更改MySQL引擎

4 有关MySQL引擎常见企业面试题

MySQL引擎概述

Mysql表存储结构是Mysql数据库的重要组成部分,下面就大家介绍3种主要mysql表存储结构MyISAM,InnoDB和NDBCluster。实际上,MySQL不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间通过插件的方式使用。下面是MySQL存储引擎体系结构简图:

1 MySAM引擎介绍

1.1 什么是MyISAM引擎?

MyISAM是MySQL关系数据库管理系统的默认存储引擎(mysql5.5以前)。这种MySQL表存储结构从旧ISAM代码扩展出许多有用的功能。在新版本的MySQL中,InnoDB引擎由于其对事务参照完整性,以及更高的并发性等优点开始逐步的取代MyISAM。

查看数据库的存储引擎:

mysql5.5

mysql-master>select version();

+------------+

| version()  |

+------------+

| 5.5.32-log |

+------------+

1 row in set (0.03 sec)

mysql-master>show engines\G

*************************** 1. row ***************************

Engine: MyISAM

Support: YES

Comment: MyISAM storage engine

Transactions: NO

XA: NO

Savepoints: NO

*************************** 2. row ***************************

Engine: FEDERATED

Support: NO

Comment: Federated MySQL storage engine

Transactions: NULL

XA: NULL

Savepoints: NULL

*************************** 3. row ***************************

Engine: MRG_MYISAM

Support: YES

Comment: Collection of identical MyISAM 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: CSV

Support: YES

Comment: CSV storage engine

Transactions: NO

XA: NO

Savepoints: NO

*************************** 6. row ***************************

Engine: MEMORY

Support: YES

Comment: Hash based, stored in memory, useful for temporary tables

Transactions: NO

XA: NO

Savepoints: NO

*************************** 7. row ***************************

Engine: InnoDB

Support: DEFAULT

Comment: Supports transactions, row-level locking, and foreign keys

Transactions: YES

XA: YES

Savepoints: YES

*************************** 8. row ***************************

Engine: PERFORMANCE_SCHEMA

Support: YES

Comment: Performance Schema

Transactions: NO

XA: NO

Savepoints: NO

8 rows in set (0.02 sec)

MYSQL5.1

mysql-master>select version();

+-----------+

| version() |

+-----------+

| 5.1.72    |

+-----------+

1 row in set (0.00 sec)

mysql-5.1>show engines\G

*************************** 1. row ***************************

Engine: MRG_MYISAM

Support: YES

Comment: Collection of identical MyISAM tables

Transactions: NO

XA: NO

Savepoints: NO

*************************** 2. row ***************************

Engine: CSV

Support: YES

Comment: CSV storage engine

Transactions: NO

XA: NO

Savepoints: NO

*************************** 3. row ***************************

Engine: MyISAM

Support: DEFAULT

Comment: Default engine as of MySQL 3.23 with great performance

Transactions: NO

XA: NO

Savepoints: NO

*************************** 4. row ***************************

Engine: InnoDB

Support: YES

Comment: Supports transactions, row-level locking, and foreign keys

Transactions: YES

XA: YES

Savepoints: YES

*************************** 5. row ***************************

Engine: MEMORY

Support: YES

Comment: Hash based, stored in memory, useful for temporary tables

Transactions: NO

XA: NO

Savepoints: NO

5 rows in set (0.09 sec)

范例:

mysql-5.1>create database oldboy;

Query OK, 1 row affected (0.00 sec)

mysql-5.1>use oldboy;

Database changed

mysql-5.1>create table test1(id int);

Query OK, 0 rows affected (0.08 sec)

mysql-5.1>show create table test1\G

*************************** 1. row ***************************

Table: test1

Create Table: CREATE TABLE `test1` (

`id` int(11) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=latin1

1 row in set (0.01 sec)

范例:

[root@php ~]# ll /application/mysql/data/oldboy/

total 20

-rw-rw---- 1 mysql mysql65 Mar 29 20:23 db.opt

-rw-rw---- 1 mysql mysql0 Mar 29 20:23 test1.MYD

-rw-rw---- 1 mysql mysql 1024 Mar 29 20:23 test1.MYI

-rw-rw---- 1 mysql mysql 8556 Mar 29 20:23 test1.frm

1.2 MyISAM引擎特点

1)※不支持事务。

2)表级锁定(更新时锁定整个表):其锁定机制是表级索引,这虽然可以让锁定的实现成本很小但是也同时大大降低了其并发性能。

3)读写互相阻塞:不仅会在写入的时候阻塞读取,MYISAM还会在读取的时候阻塞写入,但读本身并不会阻塞另外的读。

4)只会缓存索引:MYISAM可以通过key_buffer缓存以大大提高访问性能减少磁盘IO,但是这个缓存区只会缓存索引,而不会缓存数据。

[root@mysql 3307]# grep key_buffer my.cnf

key_buffer_size = 16M

5)读取速度较快。占用资源相对少。

6)不支持外键约束,但支持全文索引。

7)MYISAM引擎是MYSQL缺省的存储引擎。

什么是事务?

事务(基于 innodb 引擎的数据库,对于 myisam 引擎数据库就不支持事务)

1、事务是指逻辑上的一组操作,组成这组操作的各个单元,要么全成功要么全失败。

例如:A-B 转账,对应的如下 sql 语句

update from account set money=money-100 where name='a';

update from account set money=money+100 where name='b';

数据库默认事务是自动提交的, 也就是发一条 sql 它就执行一条。如果想多条 sql 放在一个事务中执行,则需要使用事务进行处理。当我们开启一个事务,并且没有提交,mysql 会自动回滚事务。或者我们使用 rollback 命令手动回滚事务。

事务:

一、事务介绍

通俗的说事务: 指一组SQL操作, 事务中的操作要么都发生,要么都不发生。à原子性(Atomicity)

在所有的操作没有执行完毕之前,其他会话不能够看到中间改变的过程 à隔离性(Isolation)

事务发生前和发生后,数据的完整性必须保持一致。à一致性(Consistency)

一个事务一旦被提交,它对数据库中的数据改变就是永久性的。à持久性(Durability)

如果出了错误,事务也不允许撤消, 只能通过"补偿性事务"

二、事务例子

事务例子:转账

A: ---->支出100, A -100

B: ---->收到100, B +100

A-B 转账,对应的如下 sql 语句

update from account set money=money-100 where name='a';

update from account set money=money+100 where name='b';

MySQL5.5支持事务的引擎: innodb/ndb

Make && make install

三、事务的四大特性(ACID)

1、原子性(Atomicity)

事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。

2、一致性(Consistency)

事务前后数据的完整性必须保持一致。

3、隔离性(Isolation)

多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。

4、持久性(Durability)

一个事务一旦被提交,它对数据库中的数据改变就是永久性的。

四、事务的开启:

数据库开启事务命令:

start transcation 开启事务

rollback 回滚事务

commit 提交事务

1.3 MyISAM引擎适用的生产业务场景

1、不需要事务支持的业务,一般为读数据比较多的网站应用。

2、并发相对较低的业务(纯读纯写高并发也可以)(锁定机制问题)。

3、数据修改相对较少的业务(阻塞问题)。

4、以读为主的业务,例如:www,blog,图片信息数据库,用户数据库,商品数据库等业务。

5、对数据一致性要求不是非常高的业务。

6、中小型的网站部分业务会用。

小结:单一对数据库的操作都可以使用MyISAM,所谓单一就是尽量纯读,或纯写(insert,update,delete)等。

生产建议:没有特别需求,一律用innodb

1.4 MyISAM引擎调优精要

1、尽量索引(缓存机制)。

2、调整读写优先级,根据实际需要确保重要操作更优先。

3、启用延迟插入改善大批量写入性能。(降低写入频率,尽可能多条数据一次性写入)

4、尽量顺序操作让insert数据都写入到尾部,减少阻塞。

5、分解大的操作,降低单个操作的阻塞时间。

6、降低并发数,某些高并发场景通过应用进行排队机制。

7、对于相对静态的数据,充分利用Query Cache或memcached可以极大的提高访问效率。

[root@mysql 3307]# grep query my.cnf

query_cache_size = 2M

query_cache_limit = 1M

query_cache_min_res_unit = 2k

这几个参数都是mysql自身缓存设置。

8、MYISAM的count只有在全表扫描的时候特别高效,带有其他条件的count都需要进行实际的数据访问。

mysql-5.5>  select  count(* ) from zizeng;

+-----------+

| count(* ) |

+-----------+

|        10 |

+-----------+

1 row in set (0.06 sec)

9、把主从同步的主库用innodb,从库使用myisam引擎。

2 什么是InnoDB引擎?

InnoDB引擎是MySQL的另一个存储引擎,正成为目前mysql AB所发行新版的标准,被包含在所有二进制安装包里。较之于其他的存储引擎,它的优点是支持兼容ACID的事务(类似于postgresql)以及参数完整性(即对外键的支持)。Oracle公司于2005年10月份收购了Innobase。innobase采用双认证授权。他使用GNU发行,也允许其他想将InnoDB结合到商业软件的团体获得授权。

2.1 InnoDB引擎特点

1、支持事务:支持4个事务隔离级别,支持多版本读。

2、行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响。

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

4、具有非常高效的缓存特性:能缓存索引,也能缓存数据。

5、整个表和主键以Cluster方式存储,组成一颗平衡树。

6、所有Secondary index都会保存主键信息。

7、支持分区,表空间,类似oracle数据库。

8、支持外键约束,不支持全文索引。

2.2 InnoDB引擎适用的生产业务场景

1、需要事务支持(具有较好的事务特性)

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

3、数据更新较为频繁的场景,如:bbs,sns等。

4、数据一致性要求较高的业务。例如:充值,银行转账。

5、硬件设备内存较大,可以利用InnoDB较好的缓存能力来提高内存利用率,尽可能减少磁盘IO。

[root@mysql 3307]# grep -i innodb my.cnf

#default_table_type = InnoDB

innodb_additional_mem_pool_size = 4M

innodb_buffer_pool_size = 32M    

innodb_data_file_path = ibdata1:128M:autoextend

innodb_file_io_threads = 4

innodb_thread_concurrency = 8

innodb_flush_log_at_trx_commit = 2

innodb_log_buffer_size = 2M

innodb_log_file_size = 4M

innodb_log_files_in_group = 3

innodb_max_dirty_pages_pct = 90

innodb_lock_wait_timeout = 120

innodb_file_per_table = 0

物理数据文件:

[root@mysql 3307]# ll data/ibdata1

-rw-rw---- 1 mysql mysql 134217728 May 15 08:31 data/ibdata1

6、相比Myisam引擎,innodb引擎更消耗资源,速度没有myisam引擎快。

2.3 InnoDB引擎调优精要

1、主键尽可能小,避免给Secondary index带来过大的空间负担。

2、避免全表扫描,因为会使用表锁。

3、尽可能缓存所有的索引和数据,提高响应速度,减少磁盘IO消耗。

4、在大量小插入的时候,尽量自己控制事务而不要使用autocommit自动提交。有开关可以控制提交方式;

5、合理设置innodb_flush_log_at_trx_commit参数值,不要过度追求安全性。

6、避免主键更新,因为这会带来大量的数据移动。

引擎修改

alter table test1 ENGINE = INNODB; 

mysql-5.1>use oldboy

Database changed

mysql-5.1>show create table test1\G

*************************** 1. row ***************************

Table: test1

Create Table: CREATE TABLE `test1` (

`id` int(11) DEFAULT NULL

) ENGINE=MyISAM DEFAULT CHARSET=latin1

1 row in set (0.01 sec)

mysql-5.1>alter table test1 ENGINE = INNODB; 

Query OK, 0 rows affected (0.49 sec)

Records: 0  Duplicates: 0  Warnings: 0

mysql-5.1>show create table test1\G

*************************** 1. row ***************************

Table: test1

Create Table: CREATE TABLE `test1` (

`id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.04 sec)

3 生产环境中如何批量更改MySQL引擎

法1)mysql命令语句修改:

alter table test1 ENGINE = INNODB;

更改引擎实例

mysql-5.1>alter table test1 ENGINE = INNODB;

Query OK, 0 rows affected (0.49 sec)

Records: 0  Duplicates: 0  Warnings: 0

查看修改后的结果

mysql-5.1>show create table test1\G

*************************** 1. row ***************************

Table: test1

Create Table: CREATE TABLE `test1` (

`id` int(11) DEFAULT NULL

) ENGINE=InnoDB DEFAULT CHARSET=latin1

1 row in set (0.04 sec)

特别提示:更改Mysql引擎后也需要相关参数的支持,否则,效果可能不佳。

如果批量修改可以通过脚本循环上面的命令。

法2)使用sed对备份内容进行引擎转换

nohup sed –e ‘s/MyISAM/InnoDB/g’ oldboy.sql >oldboy_1.sql &

法3)mysql_convert_table_format 命令修改

#!/bin/sh

# Created by oldboy.

# To convert a table engine.

cd /usr/local/mysql/bin

echo 'Enter Host Name:'

read HOSTNAME

echo 'Enter User Name:'

read USERNAME

echo 'Enter Password:'

read PASSWD

echo 'Enter Socket Path:'

read SOCKETPATH

echo 'Enter Database Name:'

read DBNAME

echo 'Enter Table Name:'

read TBNAME

echo 'Enter Table Engine:'

read TBTYPE

./mysql_convert_table_format --host=$HOSTNAME --user=$USERNAME --password=$PASSWD --socket=$SOCKETPATH --type=$TBTYPE $DBNAME $TBNAME

特别说明:

我们做了引擎的修改,my.cnf的参数配置也一定要跟上。

4 有关MySQL引擎常见企业面试题

1、MySQL有哪些存储引擎,各自有什么区别?

MyISAM、InnoDB、MEMORY

2、生产环境中应如何选用MySQL的引擎?

一般在既有读又有写的业务中,建议使用innodb引擎,一句话尽可能多的使用innodb引擎。

mysql-5.1>show engines;

+------------+---------+------------------------------------------------------------+--------------+------+------------+

| Engine     | Support | Comment| Transactions | XA   | Savepoints |

+------------+---------+------------------------------------------------------------+--------------+------+------------+

| MRG_MYISAM | YES     | Collection of identical MyISAM tables                      | NO           | NO   | NO|

| CSV        | YES     | CSV storage engine                                         | NO           | NO   | NO|

| MyISAM     | DEFAULT | Default engine as of MySQL 3.23 with great performance     | NO           | NO   | NO   |

| InnoDB     | YES     | Supports transactions, row-level locking, and foreign keys | YES| YES  | YES        |

| MEMORY     | YES     | Hash based, stored in memory, useful for temporary tables  | NO           | NO   | NO|

+------------+---------+------------------------------------------------------------+--------------+------+------------+

5 rows in set (0.00 sec)

mysql-5.5>  show engines;

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

| Engine             | Support | Comment| Transactions | XA   | Savepoints |

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO|

| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |

| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO|

| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO|

| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO|

| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO|

| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES| YES        |

| PERFORMANCE_SCHEMA | YES| Performance Schema                                             | NO           | NO   | NO|

+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+

8 rows in set (0.01 sec)

Mysql存储引擎概念特点介绍及不同业务场景选用依据的更多相关文章

  1. 为什么用B+树做索引&MySQL存储引擎简介

    索引的数据结构 为什么不是二叉树,红黑树什么的呢? 首先,一般来说,索引本身也很大,不可能全部存在内存中,因此索引往往以索引文件的方式存在磁盘上.然后一般一个结点一个磁盘块,也就是读一个结点要进行一次 ...

  2. {MySQL存储引擎介绍}一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用

    MySQL存储引擎介绍 MySQL之存储引擎 本节目录 一 存储引擎解释 二 MySQL存储引擎分类 三 不同存储引擎的使用 一 存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是 ...

  3. mysql 存储引擎介绍

    一  存储引擎解释 首先确定一点,存储引擎的概念是MySQL里面才有的,不是所有的关系型数据库都有存储引擎这个概念,后面我们还会说,但是现在要确定这一点. 在讲清楚什么是存储引擎之前,我们先来个比喻, ...

  4. MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎

    文章目录 Mysql逻辑架构介绍 总体概览 总体概览 mysql存储引擎 查看命令 看你的 mysql 现在已提供什么存储引擎 : 看你的 mysql 当前默认的存储引擎 : 各个引擎简介 MyISA ...

  5. [MySQL数据库之表的详细操作:存储引擎、表介绍、表字段之数据类型]

    [MySQL数据库之表的详细操作:存储引擎.表介绍.表字段之数据类型] 表的详细操作 存储引擎 mysql中建立的库======>文件夹 库中建立的表======>文件 用来存储数据的文件 ...

  6. 数据库 --> MySQL存储引擎介绍

    MySQL存储引擎介绍 MyISAM是MySQL的默认数据库引擎(5.5版之前),由早期的ISAM(Indexed Sequential Access Method:有索引的顺序访问方法)所改良.虽然 ...

  7. MYSQL存储引擎介绍--应用场景

    MySQL存储引擎通常有哪3种?各自分别有什么特点?应用场景是哪些? MySQL5.5以后默认使用InnoDB存储引擎,其中InnoDB和BDB提供事务安全表,其它存储引擎都是非事务安全表.若要修改默 ...

  8. 第 3 章 MySQL 存储引擎简介

    第 3 章 MySQL 存储引擎简介 前言 3.1 MySQL 存储引擎概述 MyISAM 存储引擎是 MySQL 默认的存储引擎,也是目前 MySQL 使用最为广泛的存储引擎之一.他的前身就是我们在 ...

  9. 【mysql】mysql存储引擎

    了解存储引擎我们先看下mysql的体系架构. 上图是mysql的逻辑架构图,可以看到分了几层. 第一层是大部分网路客户端工具,比如php,python  ,JDBC等,主要功能就是连接处理,授权认证等 ...

随机推荐

  1. 网页CSS1

    样式的属性 1,背景与前景 background-color: //背景的颜色 background-image:url //背景图片 background-attachment:fixed; //背 ...

  2. 将GridView中的数据导出到Excel代码与注意事项

    //gv:需要导出数据的GridView,filename:导出excel文件名 public void ExportToExcel(GridView gv, string filename) { s ...

  3. asp.net 面试基础题

    WebSite和WebApplication的区别1)当改变后台代码时,WebApplication需重启浏览器或者重新生成解决方案,而WebSite则不用:2)WebSite没有Solution,没 ...

  4. 利用css进行网页布局

    网页布局: 又称版式布局,是网页UI设计师将有限的视觉元素进行有机的排列组合,将理性的思维个性的化的表现出来,是一种具有个人艺术特色的视觉传达方式.传达信息的同时有美感.网页设计特点(相对纸媒来说). ...

  5. JS模拟键盘事件 -- 原理及小例子

    提问: 键盘默认事件,比如tab切换,alt+f4关闭,ctrl+t新建等,如果不想通过键盘而是一些按钮点击来触发这些功能,该咋办呢? 例子: 先以tab为例上一个小例子: <!DOCTYPE ...

  6. Css3图片圆角,兼容所有浏览器

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. SQL语句中的乘号

    在ADO中,我们需要在SQL语句中使用乘法运算,可是添加'*'以后执行程序总是会出错,这是因为‘*’与sql中的‘*’关键字重合了,所以编译会出错. 解决办法:将乘法运算放到sql语句外面,将结果放入 ...

  8. c++ 连接数据库

    #include <icrsint.h> #include<iostream> #include<iomanip> #include <string> ...

  9. 进程外组件通信之免注册com通信【原创】

    最近在搞进程外组件通信的东西,写了个demo,免注册的,一直没调通,其实就是两个问题卡了好几天,也没找到有用的资料,试了好几天终于才解决,现简单记录下来,免得大家跟我走一样的弯路.下面com端程序名称 ...

  10. FJ省队集训DAY3 T2

    思路:如果一个DAG要的路径上只要一条边去切掉,那么要怎么求?很容易就想到最小割,但是如果直接做最小割会走出重复的部分,那我们就这样:反向边设为inf,这样最小割的时候就不会割到了,判断无解我们直接用 ...