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 : chenzhipeng.m@gmail.com
# @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毫秒
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,692评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,482评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,995评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,223评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,245评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,208评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,091评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,929评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,346评论 1 311
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,570评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,739评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,437评论 5 344
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,037评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,677评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,833评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,760评论 2 369
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,647评论 2 354

推荐阅读更多精彩内容