存储引擎

现实生活中我们用来存储数据的文件应该有不同的类型:比如存文本用txt类型,存表格用excel,存图片用png等。数据库中的表也应该有不同的类型,表的类型不同,会对应mysql不同的存取机制,表类型又称为存储引擎。

存储引擎说白了就是如何存储数据、如何为存储的数据建立索引和如何更新、查询数据等技术的实现方法。因为在关系数据库中数据的存储是以表的形式存储的,所以存储引擎也可以称为表类型(即存储和操作此表的类型)

在Oracle 和SQL Server等数据库中只有一种存储引擎,所有数据存储管理机制都是一样的。而MySQL数据库提供了多种存储引擎。用户可以根据不同的需求为数据表选择不同的存储引擎,用户也可以根据自己的需要编写自己的存储引擎。

MySQL最常用的两个引擎:MyISAM 和 InnoDB 这里说一下二者的主要特性和区别。

MyISAM 支持全文索引,不支持事务、也不支持外键,所以访问速度较快。因此当对事务完整性没有要求并以访问(SELECT, INSERT)为主的应用适合使用该存储引擎

InnoDB 在支持事物,即支持具有提交、回滚及崩溃恢复能力等事务特性,所以比MyISAM存储引擎占用更多的磁盘空间,写的效率也差一些。因此当需要频繁的更新、删除操作,同时还对事务的完整性要求较高(类似计费系统或者财务系统等对数据准确性要求比较高的系统),需要实现并发控制,建议选择。

另外,二者对锁的支持也有不同,MyISAM 支持表锁,而InnoDB 支持行锁和表锁。

要对某个数据执行操作,在此期间不希望其它请求修改该数据时,就可以加锁。

MyISAM 表锁

MyISAM 表锁有两种:表共享读锁(Table Read Lock)和表独占写锁(Table Write Lock)。

  • 表共享读锁:不会阻塞其它用户对同一表的读请求,但会阻塞对同一表的写请求。
  • 表独占写锁:阻塞其它用户对同一表的读和写操作。

加锁和解锁:

-- 加读锁
LOCK TABLE tablename READ
-- 加写锁
LOCK TABLE tablename WRITE-- 对数据库数据执行操作
-- SELECT ...

-- 解锁
UNLOCK TABLES

MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作(UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁。MyISAM表的读操作与写操作之间,以及写操作与写操作之间是串行的!

InnoDB 行锁和表锁

行锁

InnoDB 实现了以下两种类型的行锁:

  • 共享锁:其它事物仍然可以查询,并获得共享锁,但是不能UPDATE 或者 DELETE 操作。一旦获得共享锁的当前事物需要对共享锁记录进行更新操作,而另一个事物也有共享锁时,需要等待锁,直到另一个事务死锁退出而获得锁。
  • 排他锁:允许获得排他锁的事务更新数据,其它事物可以查询记录,但是不能加共享锁更不能更新数据据,要等待锁。

对于 UPDATE、 DELETE 和 INSERT 语句, InnoDB会自动给涉及数据集加排他锁;对于普通 SELECT 语句,InnoDB 不会加任何锁;

显示地给记录集加共享锁或排他锁。

SELECT * FROM table_name WHERE ... LOCK IN SHARE MODE。 -- 共享锁
SELECT * FROM table_name WHERE ... FOR UPDATE。 -- 排它锁

行锁实现方式及注意事项

InnoDB 行锁是通过给索引上的索引项加锁来实现的,这一点 MySQL 与 Oracle 不同,后者是通过在数据块中对相应数据行加锁来实现的。InnoDB 这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB 才使用行级锁,否则,InnoDB 将使用表锁!

以下情形(id是主键索引)将会使用表锁:

  • 根据索引未找到数据

    SELECT * FROM table WHERE id=xx FOR UPDATE
  • 根据索引找到的数不明确

    SELECT * FROM table WHERE id>xx FOR UPDATE
  • 根据非索引查找

    SELECT * FROM table WHERE name = xx FOR UPDATE

在Django ORM中加锁

需要通过事务来实现:

from django.db import transaction  # 导入事务
with transaction.atomic():res = models.UserInfo.objects.filter(id=1).select_for_update()

MySQL存储引擎:MyISAM InnoDB相关推荐

  1. mysql dba系统学习(20)mysql存储引擎MyISAM

    mysql存储引擎MyISAM 1,创建myisam表 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 mysql> creat ...

  2. MySQL存储引擎(InnoDB引擎)

    本篇章主要介绍什么是 MySQL 存储引擎?常用的 MySQL 存储引擎有哪些?以及详细介绍一下目前应用最广泛的 InnoDB 存储引擎,包括其:逻辑存储结构.架构.事务原理.MVCC等. 一.初识  ...

  3. mysql存储引擎中INNODB和MyISAM的区别

    切记:存储引擎是基于表的,而不是数据库. 存储引擎概念: MySQL中的数据用各种不同的技术存储在文件(或者内存)中.这些技术中的每一种技术都使用不同的存储机制.索引技巧.锁定水平并且最终提供广泛的不 ...

  4. MySQL 存储引擎(InnoDB、MyISAM、MEMORY)

    一.MySQL的体系结构 1.连接层:最上层是一些客户端和链接服务,主要完成一些类似于连接处理.授权认证.及相关的安全方案.服务器也会为安全接入的每个客户端验证它所具有的操作权限. 2.服务层:第二成 ...

  5. MySQL - 存储引擎MyISAM和Innodb

    1. 概述 首先,我们先看一下MySQL的体系架构,对MySQL整个架构有一个直观的感受: MySQL Server架构自顶向下大致可以分网络连接层.服务层.存储引擎层和系统文件层. 存储引擎在MyS ...

  6. MySQL存储引擎及InnoDB并发控制介绍

    MySQL存储引擎采用了可插拔的结构,即用户可以根据自己的需要来选择不同的存储引擎. 下表是MySQL不同的存储引擎的不同的特性: Feature<?xml:namespace prefix = ...

  7. Mysql存储引擎MyIsAM和InnoDB区别

    Mysql 数据库中,最常用的两种引擎是innordb 和myisam.InnoDB 是Mysql 的默认存储引擎. 两者的区别: 1.事务处理上方面 MyISAM:强调的是性能,查询的速度比Inno ...

  8. MySQL 存储引擎(MyISAM、InnoDB、NDBCluster)

    前言 MySQL 的存储引擎可能是所有关系型数据库产品中最具有特色的了,不仅可以同时使用多种存储引擎,而且每种存储引擎和MySQL之间使用插件方式这种非常松的耦合关系. 由于各存储引擎功能特性差异较大 ...

  9. MySQL 存储引擎 | MyISAM 与 InnoDB

    文章目录 概念 innodb引擎的4大特性 索引结构 InnoDB MyISAM 区别 表级锁和行级锁 概念 MyISAM 是 MySQL 的默认数据库引擎(5.5版之前),但因为不支持事务处理而被 ...

  10. 浅谈MySQL存储引擎选择 InnoDB还是MyISAM

    如果是一些小型的应用或项目,那么MyISAM 也许会更适合.当然,在大型的环境下使用MyISAM 也会有很大成功的时候,但却不总是这样的.如果你正在计划使用一个超大数据量的项目,那么你应该直接使用In ...

最新文章

  1. SharePoint 2013 APP 开发示例 系列
  2. 湖南工程学院计算机毕业设计,湖南工程学院毕业设计模板.docx
  3. Java黑皮书课后题第1章:1.2(显示五条消息)编写程序,显示以下表格
  4. J2SE理解之一:声明和访问控制
  5. dwr 写的小程序,配置
  6. 基于DeepConvLSTM的传感器信号分类
  7. 开机登录时取消Ctrl+Alt+Delete
  8. PS2: 这篇文章中的图片绘图工具使用的是Dia (sudo apt-get install dia)。据说yEd也很不错。...
  9. js获取ck_js取不到ckeditor textarea值
  10. 现在做网络推广,哪种方式最好?
  11. P3161 [CQOI2012]模拟工厂
  12. EDI系统-AS2传输常见问题
  13. 保健品消费者需求调查方案
  14. 高考计算机会考等级划分标准,高中学业水平考试等级是怎么划分的
  15. matlab单目相机标定
  16. 大数据分析及挖掘技术
  17. 助企开门红 浙江省科技厅厅长高鹰忠一行到访加速科技
  18. c盘oracle文件夹,C盘的用户文件夹转移到其他分区
  19. 非易失性NV-SRAM简介
  20. Java实验之设计一个动物声音“模拟器”,希望模拟器可以模拟许多动物的叫声

热门文章

  1. (王道408考研数据结构)第五章树-第三节1:二叉树遍历(先序、中序和后序)
  2. Shell 计算两个数的加减乘除取余(+、-、*、\、/)
  3. 手机User-Agent大全(Android爬虫)
  4. C/C++端口复用SO_REUSEADDR(setsockopt参数)
  5. Python3 获取当前路径,当前文件名,当前文件名路径、指定import的文件路径、程序路径
  6. maven打包不用eclipse插件
  7. iOS 直播推流 - 搭建基于RTMP的本地Nginx服务器
  8. 谈论AI之前,你搞懂人类了吗?(颠覆认知)
  9. STM32之FSMC-SRAM/NOR原理
  10. python集合常用方法_Python中集合类型(set)学习小结