什么是存储引擎

存储引擎位于文件系统(各种数据,二进制形式)之上,各种管理工具(连接池、语义分析器、优化器、缓存区、SQL接口)之下。

存储引擎功能设计

功能丰富性(或者SQL语义支持):

事务(和文件系统的最大区别),锁的粒度(行或者表),全文索引,簇索引,外键(这是什么)

事务:

事务的隔离性由锁实现,其他ACD由redo log和undo logo实现。redo log保证事务原子性(怎么理解?由于数据库设计是先写redo,再执行真正修改数据页。所以redo一定是个完整的事务,才会修改数据页)和持久性(怎么理解?持久化到硬盘)。undo log保证事务一致性(数据冲突时的恢复)。

redo 写法是数据库一直顺序写,无需读。由于没有使用O_DIRECT裸写盘,所以每次写redo 必须fsync到硬盘。

另外这里还有提到的是binlog,区分的是binlog是数据库容灾的范筹(记录的是sql语句,在事务提交的时候才会写)。而redo是innodb产生的(修改页的物理二进制日志,随事务进行而并发写)。而且在写redo是以日志块大小和磁盘扇区一样。都是512字节。所以重写日志写入具有原子性。redo的物理二进制日志,以不记录sql语句执行过程,而记录sql执行后的页结果。由此具有幂等性(执行多次等同于执行一次,分布式网络的不可靠 由于多次重新调用接口,必须保证幂等性)。

一个问题是,基于硬盘的数据库会把数据写在内存中,同时对数据库的修改最初也是改在内存上,怎么落地呢(checkpoint检查点机制)。事务数据库为了保证ACID的D一般会使用先写redo log,在修改页。

undo帮助事务回滚和MVCC功能。

表锁、行锁:

锁机制分为latch(轻量级的锁,分为mutex和rwlock。这个是内部锁机制,保证并发线程操作临界资源的正确性,通常没有死锁检测机制,  比如查看mutex的方法是show engine innodb mutex;)和lock(粒度为事务,可以是表、页、行,有死锁检测机制)。

死锁检测机制有:顺序获取多个锁(latch只有这个机制),waits-for graph(图死锁检测),过期机制。

MVCC机制(解决锁带来争用的分布式并发访问问题)

自增长锁:给每个插入赋予一个唯一增加的id,每个插入获取到这个id,就可以释放表锁。通过减少锁的持有时间,提高并发插入效率。

查看当前事务隔离级别:

mysql> SELECT @@tx_isolation\G;*************************** 1. row ***************************@@tx_isolation: REPEATABLE-READ

幻读和脏读:脏读都不好吗?在slave节点可以修改innodb的默认事务隔离级别REPEATEDLY READ为READ UNCONMITTED,允许读到不那么准确的数据。

不可重复读:一般不可重复读是可以接受的,因为他读到的是提交的数据,而脏读是读到未提交的数据。如Oracle和SQL Server设置的事务隔离级别是READ CONMIITTED,则会出现不可重复读现象。

丢失更新:一个事务更新会被另一个事务更新所覆盖,从而产生数据不一致。基本数据库任何隔离级别,不会产生。

数据存储设计:

支持B树索引,支持hash索引,数据压缩存储,数据表缓存(或者只索引缓存),数据文件加密,存储效率,内存消耗,硬盘消耗,块插入速度,查询缓存,MVCC(解决并发数据一致性问题)。

B+树索引/自适应hash索引:

B树(Blance树或者平衡树):关系型数据库最常用拿来做索引的。从AVL(平衡二叉树演化而来)。

B+树=B树+索引顺序访问。包含树枝节点和叶子节点。所有的数据放在叶子节点。每一个叶子节点互相有序顺序连接。树根节点指引着查找到叶子节点的路径。由于不断的插入和删除,同时B+树会通过旋转保持平衡。

B+索引本身并不是找到具体的一条记录,而是找到该记录所在的页。数据页把载入到内中,然后通过页目录在进行二叉查找。因为在内存查找很快。

聚集索引:按照表的主键构建的B+树。

辅助缩影:叶子节点存放的不是数据,而是捷径,指引到找到所有数据的地方。

数据的区分度:Cardinality

自适应哈希索引:innodb根据查找频度,创建hash索引。将o(logn)的查找复杂度提高最快o(0)(最慢o(n))的速度。哈希索引不对范围查找有效。

压缩空间和加密安全:

记录在文件可以是普通模式或者reduction模式。

容灾机制:

备份机制,备份恢复(备份快照点记录)。热备,冷备,温备。

新上一台备机的备份顺序是记住当前主数据库的LSN(log squence number),导出主数据库的当前数据库并在备机导入。设置LSN同步点。

innodb特性

特性:

  • innodb架构:多线程模型(Master,IO,Purge,Page Cleaner),数据刷新到硬盘才是sql(事务)执行完的标志吗。purge是完成事务提交后情况undo log。

  • 内存的消耗大(大在哪里?)。内存消耗在具体在缓冲区。缓冲区除了保护有数据页,索引页,还有undo页,插入缓冲。自适应hash索引、锁信息、字典信息。为什么innodb的内存会比其他的存储引擎大呢?

  • 什么是数据库实例(类似于服务器的进程,数据库是数据文件)

  • 缓冲区的基本管理思路是LRU。37为距离LRU追加尾部的37%位置,并且只有在mid位置当超过block_times的时候才要可以会被移到mid的热点。当然用户预估自己的热点数据,适当得增加mid之前的热点区域。其中page made young和page not made young就表示了页从old移到new或者由于block_time的限制,old没能移到new。从information_schema数据库的select * from innodb_buffer_pool_stats\G;可以获取到。可以看到这里还是很多old往new的迁移过程当中被block住。(我觉得这里made yong的过程中,是不是有很多热点数据,有没有必要把mid位置调长些)。第一个实例:缓冲区空间size:8192*16K=128M。LRU表项用DATABASE_PAGES表示。FREE_BUFFERS是可利用的页。

  • 主线程:每秒钟循环和每10秒钟循环

  • 重做日志的LSN(Log Sequeence Number)标记版本。

  • Sharp Checkpoint和Fuzzy Checkpoint(主线程定时的刷新,LRU页不够必须删除尾巴页,重做日志不可用,脏页太多)

  • 数据库的容灾:重做日志+LRU。LRU溢出需要写磁盘。重做日志由于磁盘空间必须部分删除需要写磁盘

innodb关键特性:

  • 插入缓冲:针对非聚集索引的插入或者更新。针对非唯一辅助索引。

  • 两次写:写的压力大不大,总共写内存多少Innodb_dblwr_pages_written(真实反映数据库的),硬盘持久化多少次Innodb_dblwr_writes

  • 自适应hash索引:要求访问模式比较单一

  • AIO:AIO的好处和坏处。:| innodb_flush_neighbors         | 1     |

  • 刷新邻接页(预读)。但是如果是本来 就是iops比较高的存储设备还需要这个吗,因为这个是对机械硬盘相邻数据写入做优化,或者有没有可能领接页写入刷新了 又很快变为脏页。

查看当前数据库运行性能

show global status like 'com_select';列出 自数据库启动以来的所有连接

查看数据库的线程数据来窥探性能

查看缓存区状态

LRU查看

mysql> show variables like '%old_block%';+------------------------+-------+| Variable_name          | Value |+------------------------+-------+| innodb_old_blocks_pct  | 37    || innodb_old_blocks_time | 1000  |+------------------------+-------+

查看当前数据库的运行状态还有

show engine innodb status。show variables;show status;

备份相关

show binlog events in 'bin-log.000004'\Gshow master statusshow slave statusshow binary logs;查看所有的二进制日志show variables like '%sync_binlog%'binlog文件转换每次服务器启动都开启一个新的二进制日志。文件大小超过限制将会创建一个新的文件。

-------END-------

你可能还想阅读:

DevOps时代的软件过程改进探讨

图解大型网站技术架构的历史演化过程

我们常听说UDP反射攻击,听说过TCP反射攻击吗?

MySQL索引存储顺序和order by不一致,怎么办?

关注云加社区,回复 3 加读者群

在看,让更多人看到!

不提交怎么获取input中的值并存储_快速读懂innodb存储引擎相关推荐

  1. php中多选提交如何获取,php中checkbox值获取,显示,多选值获取

    php教程中checkbox值获取,显示,多选值获取 最简单checkbox获取值代码 checkbox demo checkbox demo demonstrates checkboxes =&qu ...

  2. js 获取input 中name值的问题

    获取单选按钮选中的name值 :var replyidRadio =  $("input[name='replyidRadio']:checked").val(); 获取check ...

  3. 获取input中的值

    先在input标签中添加一个id='getvalue'document.getElementById("getvalue").value;

  4. PHP获取input中的值相同报错,laravel单元测试之phpUnit中old()函数报错解决_php实例...

    前言 最近在做laravel单元测试.遇到了一个问题: 当添加的view里面使用old()函数时就会报错,正常url访问没问题,但是在phpUnit中就报错 错误原因: exception 'Runt ...

  5. Jquery获取列表中的值和input单选、多选框控制选中与取消

    一.Jquery获取列表中的值 1.jsp页面代码 <tbody><c:forEach var="model" items="${listRefEnti ...

  6. 【杂记】(input获取焦点失去焦点、获取input中输入的值、 键盘事件、js事件、Math 属性、手机自适应meta定义、 去掉input内置阴影、图片居中、去蓝色默认背景、点击去掉默认边框)

    1. input获取焦点失去焦点 input:focus{border:1px red solid:} 获取焦点 .focus()失去焦点.blur() 2. 获取input中输入的值 <inp ...

  7. php监听input,jQuery如何实时监听获取input输入框的值

    jQuery实时监听获取input输入框的值,在我们日常web项目开发也常需要去实现这样的功能效果.为了作出即时动作去引导浏览者,以便提高网站的用户体验感. 下面我们就结合具体的代码示例,为大家介绍j ...

  8. selenium获取input的value值

    用selenium获取input中的value值,需要用到一个函数: from selenium import webdriverbrowser = webdriver.Chrome("d: ...

  9. Thymeleaf-如何获取model中的值

    后台的实现: @RequestMapping("/adds") public String ProtaskAdd(Model model){model.addAttribute(& ...

  10. pandas获取dataframe中索引值最大值所在的数据行(get dataframe row of max index value)

    pandas获取dataframe中索引值最大值所在的数据行(get dataframe row of max index value) 目录 pandas获取dataframe中索引值最大值所在的数 ...

最新文章

  1. Java类加载机制详解【java面试题】
  2. 你管这破玩意儿叫负载均衡?
  3. 百度腾讯齐刷刷强调“产业+AI”,李彦宏看深,马化腾见远
  4. 1449 砝码称重(思维)
  5. php实现双向队列详解,PHP实现一个双向队列例子
  6. python中八进制_在Python中以八进制格式输入数字
  7. python文档字符串格式_Python字符串及文本模式方法详解
  8. ios自定义控件,使UIScrollView自己处理输入时键盘遮挡控件
  9. jquery-pjax
  10. php怎么循环显示图片,thinkphp 循环显示图片问题!!!~~~~
  11. EMNLP'21 Findings|字节火山翻译提出:基于自修正编码器的神经机器翻译
  12. springcloud feign负载均衡_SpringCloud学习笔记(2)——Ribbon
  13. 数字电路-时序逻辑电路
  14. RESTFUL API 安全设计指南
  15. 20159318 《网络攻防实践》第2周学习总结
  16. ps—简易理解ps图层的各种混合模式
  17. MATLAB中排序sort函数的用法
  18. 【cmake学习】cmake 引入第三方库(头文件目录、库目录、库文件)
  19. 字节社交转向:放弃飞聊,押注元宇宙社交
  20. 嵌入式Linux驱动笔记(二十五)------Input子系统框架

热门文章

  1. Maybe it's time to go away
  2. ADSL桥接模式和路由模式的区别(转)
  3. idea exclude from compile 再加回来
  4. DB2 在创建数据库的时候,后面不能加“;”分号
  5. C语言中register类型变量
  6. 《DNS与BIND(第5版)》——第10章 高级功能10.1 地址匹配列表和ACL
  7. sqlserver2008r2通过发布和订阅的方式进行数据库同步
  8. UrlRewriter配置IIS支持伪静态
  9. 用Intel线程构建块进行安全、可伸缩性的并行编程
  10. 有趣的问题:C的表达式x == x,何时为假?!