MySQL存储引擎–MyISAM和InnoDB的区别

MyISAM和InnoDB对比

InnoDB占优势的项

InnoDBMyISAM
事务支持。 每条SQL语言都默认封装成事务,自动提交。最好把多条SQL语言放在begin和commit之间,组成一个事务不支持
外键支持。 将拥有外键的InnoDB表转成MyISAM会失败报错不支持
表级锁、行级锁(默认)。 行锁实现在索引上,不是锁在物理行记录上。若访问没有命中索引,行锁退化为表锁。表级锁 并发量低。
崩溃恢复支持不支持

MyISAM占优势的项

InnoDBMyISAM
全文索引不支持支持

注意:从MySQL5.6之后,InnoDB也支持全文索引了。

使用场景

InnoDBMyISAM
并发高或需要事务的地方。读操作远远超过写操作,且不需要事务的地方。

区别:

1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务;

2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败; 

3. InnoDB支持表级锁、行(默认)级锁,而MyISAM支持表级锁

       InnoDB的行锁是实现在索引上的,而不是锁在物理行记录上。潜台词是,如果访问没有命中索引,也无法使用行锁,将要退化为表锁。

例如:
 
    t_user(uid, uname, age, sex) innodb;
 
    uid PK
    无其他索引
    update t_user set age=10 where uid=1;             命中索引,行锁。
 
    update t_user set age=10 where uid != 1;           未命中索引,表锁。
 
    update t_user set age=10 where name='chackca';    无索引,表锁。

4.系统崩溃后,MyISAM恢复起来更困难

5. Innodb不支持全文索引,而MyISAM支持全文索引,在涉及全文索引领域的查询效率上MyISAM速度更快高;PS:5.7以后的InnoDB支持全文索引

如何选择:
    1. 是否要支持事务,如果要请选择innodb,如果不需要可以考虑MyISAM;

    2. 如果表中绝大多数都只是读查询,可以考虑MyISAM,如果既有读也有写,请使用InnoDB。

    3. 系统奔溃后,MyISAM恢复起来更困难,能否接受;

    4. MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM),说明其优势是有目共睹的,如果你不知道用什么,那就用InnoDB,至少不会差。

参考:MyISAM与InnoDB 的区别(9个不同点)_innodb和myisam的区别-优快云博客

引自:MySQL存储引擎-MyISAM和InnoDB的区别 - 自学精灵 (skyofit.com)

补充解释:如何使用begin和commit来提交事务

引自:python实现一次性封装多条sql语句(begin end) - qhlhaylee - 博客园 (cnblogs.com)

import MySQLdb

# 获取数据库连接
db = MySQLdb.connect(host="localhost", user="root",
                     passwd="password", db="test")

# 获取游标
cursor = db.cursor()

# 多个SQL语句
sqlList = [
    "UPDATE tbl SET col1 = val1 WHERE id = 1",
    "UPDATE tbl SET col2 = val2 WHERE id = 2",
    "UPDATE tbl SET col3 = val3 WHERE id = 3"
]

try:
    # 开始事务
    cursor.execute("BEGIN")
    # 执行全部SQL语句
    for sql in sqlList:
        cursor.execute(sql)
    # 提交事务
    cursor.execute("COMMIT")
except MySQLdb.Error as e:
    # 如果出错,回滚事务
    print("Error %d: %s" % (e.args[0], e.args[1]))
    cursor.execute("ROLLBACK")
finally:
    # 关闭游标和数据库连接
    cursor.close()
    db.close()

上面这个示例演示了多个SQL语句同时执行的情况。其中,我们使用了BEGINCOMMIT语句来开始和提交事务,这可以保证多个SQL语句的原子性,即它们要么全部执行成功,要么全部回滚。如果在执行过程中出现错误,我们使用ROLLBACK语句回滚事务。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值