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引擎的特点:
- 支持事务
- 数据多版本读取(InnoDB+MyISAM+ISAM)
- 锁定机制的改进
- 实现外键
innodb与myisam区别
- InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin transaction和commit之间,组成一个事务;
- InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败;
- InnoDB是聚集索引,数据文件是和索引绑在一起的,必须要有主键,通过主键索引效率很高。但是辅助索引需要两次查询,先查询到主键,然后再通过主键查询到数据。因此,主键不应该过大,因为主键太大,其他索引也都会很大。而MyISAM是非聚集索引,数据文件是分离的,索引保存的是数据文件的指针。主键索引和辅助索引是独立的。
- InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快;
- Innodb不支持全文索引,而支持全文索引,查询效率上MyISAM要高;
试验实测
环境准备
- 首先我准备了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引擎。
准备一些数据测试
我用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引擎总记录数统计用时
用时:21秒783毫秒
使用MyISAM引擎进行总记录数统计
总记录数为:10724264条记录
MyISAM引擎总记录数统计用时
用时:27毫秒
Innodb引擎统计总金额用时
用时:22秒101毫秒
Innodb引擎统计总金额
MyISAM引擎统计总金额用时
用时:7秒938毫秒
MyISAM引擎统计总金额
总金额为:1126246117.4452295
最后总结结果:
一样的结果不一样的效率!!!
MySQL数据库引擎 | 统计总记录数 | 总记录数用时 | 统计总金额 | 统计金额用时 |
---|---|---|---|---|
InnoDB | 10724264 | 21秒783毫秒 | 1126246117.4452295 | 22秒101毫秒 |
MyISAM | 10724264 | 27毫秒 | 1126246117.4452295 | 7秒938毫秒 |