MySQL数据库引擎介绍和使用

MySQL数据库引擎介绍和使用

1.ISAM

在设计ISAM之前就考虑到查询的次数要大于数据更新的次数,因此ISAM引擎的读取的效率是非常的快的,不占用大量的内存和存储空间,但是不支持事物的处理,下面分析ISAM引擎的优缺点。

ISAM的优点:

读取数据速度快、不占用大量的内存和存储资源

ISAM的缺点:

不支持事物
不容错

使用ISAM引擎的注意点:

由于他不支持事物的处理,并且不容错,所以必要备份数据。

2.MyISAM

MyISAM是MySQL对于ISAM的扩展引擎,在MySQL5.6以后的版本出现,简单来说ISAM引擎有的东西,它都有,MyISAM提供了索引和字段管理的大量功能,MyISAM还提供了表格锁定的机制用来优化多个并发的读写操作、但是有代价的,要经常运行 OPTIMIZE TABLE 命令来恢复优化过机制所浪费的空间、MyISAM知道自己的缺点所以提供了优化工具、比如MyISAMCHK工具用来恢复浪费的空间。

MyISAM的优点:

增强了ISAM引擎的功能,增加了索引、表格锁的机制优化并发读写

MyISAM的缺点:

因为有了表格锁的机制、最大的缺陷就是不能在表损坏后恢复数据,和ISAM一样不支持事物,数据量越大、写入效率越低。

使用MyISAM引擎的注意点:

数据要备份、虽然有索引提升效率,但是要正确的使用索引,如果索引的字段越多维护索引的信息就会越多,随着数据量的增加,相对的效率也会降低。

使用MyISAM引擎生成的文件

如果使用MyISAM数据库引擎,会生成三个文件:
.frm:表结构信息
.MYD:数据文件
.MYI:表的索引信息

3.InnoDB引擎

InnoDB数据库引擎是直接造就MySQL辉煌的引擎,他能弥补ISAM、MyISAM的不足之处,他能支持事物的处理、也能支持外键、尽管比ISAM、MyISAM的查询速度慢一点,但是自身‘全能’的优点完全可以胜出,现在MySQL5.6以上的版本默认的数据库引擎是InnoDB引擎MySQL,官方对InnoDB是这样解释的:InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特色增加了多用户部署的性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。

InnoDB的优点:

遵循ACID模式设计,具有事务,回滚和保护用户数据的崩溃恢复能力,InnoDB为大数据量发挥最大性能而设计的,针对提升CPU的效率而生,其它任何基于磁盘的关系数据库引擎都不能和它做比较。

InnoDB的缺点:

没有MyISAM、ISAM查询速度来的快。

InnoDB引擎的特点:
  1. 支持事务
  2. 数据多版本读取(InnoDB+MyISAM+ISAM)
  3. 锁定机制的改进
  4. 实现外键

innodb与myisam区别

  1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin transaction和commit之间,组成一个事务;
  2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
  3. InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
  4. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
  5. Innodb不支持全文索引,而支持全文索引,查询效率上MyISAM要高;

试验实测

环境准备

  1. 首先我准备了2台MySQL,我用virtualBox做成的虚拟机同样的配置
MySQL数据库主机 数据库引擎
192.168.56.110 InnoDB
192.168.56.111 MyISAM
使用Innodb引擎创建表结构

在192.168.56.110数据库上建立Innodb引擎,(engine = InnoDB)意思采用InnoDB引擎,一般建表可以不加,默认是InnoDB引擎。

create table user
(
  id         varchar(50) not null
    primary key,
  name       varchar(50) null,
  address    varchar(50) null,
  message    text        null,
  phone      varchar(50) null,
  creat_data date        null,
  email      varchar(50) null,
  company    varchar(50) null,
  barcode    varchar(50) null,
  money      double      null
) engine = InnoDB;
使用MyISAM引擎创建表结构

在192.168.56.111数据库上建立MyISAM引擎,(engine = MyISAM)声明当前表采用的是MyISAM引擎

create table user
(
  id         varchar(50) not null
    primary key,
  name       varchar(50) null,
  address    varchar(50) null,
  message    text        null,
  phone      varchar(50) null,
  creat_data date        null,
  email      varchar(50) null,
  company    varchar(50) null,
  barcode    varchar(50) null,
  money      double      null
) engine = MyISAM;
分别查看创建的表结构
show create table user

可以看到192.168.56.110数据库上的是采用的是InnoDB引擎,192.168.56.111数据库上的是采用的是MyISAM引擎。

192.168.56.110数据库
192.168.56.111数据库
准备一些数据测试

我用python写了一个生成数据的脚本,可以直接生成辣鸡数据(过程漫长),为了验证有效性,我这里生成了1000多万条的测试数据

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : TestData.py
# @Author: zhipneg_Chen
# @Date  : 2018/6/23
# @Contact : [email protected]
# @Software : PyCharm
import random
import pymysql
from faker import Factory
fake = Factory.create('zh_CN')

for i in range(30000000):

    db = pymysql.connect("localhost", "root", "123456", "test2", charset='utf8')

    cursor = db.cursor()

    sql='insert into user (id,name,address,message,phone,creat_data ,email,company,barcode,money) value ("%s", "%s","%s", "%s","%s", "%s","%s", "%s","%s","%s")'%\
        (fake.uuid4(), fake.name(), fake.address(), fake.text(), fake.phone_number(), fake.date(), fake.email(), fake.company(), fake.ean13(), random.uniform(10, 200))

    try:
        cursor.execute(sql)
        db.commit()
    except:
        db.rollback()
    db.close()
测试数据如下:
测试数据
测试结果:

使用Innodb引擎进行总记录数统计
总记录数为:10724264条记录


Innodb引擎进行总记录

Innodb引擎总记录数统计用时
用时:21秒783毫秒


Innodb引擎统计用时

使用MyISAM引擎进行总记录数统计
总记录数为:10724264条记录


MyISAM引擎统计总记录数

MyISAM引擎总记录数统计用时
用时:27毫秒


MyISAM统计用时

Innodb引擎统计总金额用时
用时:22秒101毫秒


Innodb引擎统计总金额用时

Innodb引擎统计总金额


Innodb统计总金额

MyISAM引擎统计总金额用时
用时:7秒938毫秒


MyISAM引擎总统计用时

MyISAM引擎统计总金额
总金额为:1126246117.4452295


MyISAM引擎统计总金额

最后总结结果:
一样的结果不一样的效率!!!

MySQL数据库引擎 统计总记录数 总记录数用时 统计总金额 统计金额用时
InnoDB 10724264 21秒783毫秒 1126246117.4452295 22秒101毫秒
MyISAM 10724264 27毫秒 1126246117.4452295 7秒938毫秒

你可能感兴趣的:(MySQL数据库引擎介绍和使用)