InnoDB

深入了解Mysql索引

时间秒杀一切 提交于 2021-02-17 21:49:29
前言 欢迎关注我的微信公众号【 Mflyyou 】获取持续更新。 github.com/zhangpanqin/MFlyYou 收集技术文章及我的系列文章,欢迎 Star。 数据库中的索引是为了提高查询效率的,将像字典的目录一样。 当我们了解索引的原理之后,就没有必要去死记硬背所谓的 Mysql 军规之类的东西了。 本文内容 索引的类型:UNIQUE,FULLTEXT,SPATIAL,NORMAL(普通索引) 索引为什么会采用 B+ 树结构,为什么不是二叉树、B- 树 Mysql 中 B+ 树索引 和 Hash 索引应该选哪个 为什么索引的使用需要遵循 最左匹配原则 联合索引 、 聚簇索引 和 覆盖索引 分别是什么 索引添加的判断依据是什么 索引 Mysql 中常见的索引类型有: 普通索引 唯一索引 全文索引 空间索引 Mysql 中索引的数据结构有: B+Tree ,存储引擎 InnoDB 和 MyISAM 都支持。因为我们一般都是使用存储引擎 InnoDB 和 MyISAM ,我们都是使用 B+Tree 数据结构的索引。 HASH ,存储引擎 MEMORY 支持,存储引擎 InnoDB 和 MyISAM 不能手动定义 HASH 索引。 因此,我们详细了解 B+Tree 就行了。 我们先来介绍一下两种索引的数据结构的区别,感受一些各自的使用场景。 Hash 数据结构的索引

事务特性,事务的隔离级别,并发事务可能出现的问题,spring事务 数据库锁

六眼飞鱼酱① 提交于 2021-02-17 18:48:25
1.0 事务特性(ACID) Atomicity:原子性,一个事务不可以被拆分 Consistency:一致性,在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏;比如我们做银行转账的相关业务,A转账给B,要求A转的钱B一定要收到。如果A转了钱而B没有收到,那么数据库数据的一致性就得不到保障,在做高并发业务时要注意合理的设计。 Isolation:隔离性,并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响,这需要事务隔离级别来指定隔离性; Durability:持久性,事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因各种异常导致数据不一致或丢失。 1.1 事务的隔离级别   READ_UNCOMMITTED 会出现脏读、不可重复读、幻读 ( 隔离级别最低,并发性能高 )   READ_COMMITTED 会出现不可重复读、幻读问题(锁定正在读取的行)   REPEATABLE_READ 会出幻读(锁定所读取的所有行)   SERIALIZABLE 保证所有的情况不会发生(锁表) 大多数数据库的默认隔离级别为: Read Commited,如Sql Server , Oracle . 少数数据库默认的隔离级别为Repeatable Read, 如 MySQL InnoDB存储引擎 1

my40_MySQL锁概述之意向锁

旧街凉风 提交于 2021-02-17 03:49:56
本文在锁概述的基础上,通常实验举例,详细地介绍了意向锁的原理。 锁范围 全局锁(global lock) 表锁(table lock) 行锁 (row lock) ROW LOCK的粒度 LOCK_REC_NOG_GAP, record lock with out gap lock LOCK_GAP, gap lock LOCK_ORDINARY , next key lock = record lock + gap lock 锁等待与死锁 锁等待 事务提交或等待超时;死锁,是一个死循环。死锁中必有锁等待。 表锁 5.5以后在server层实现表锁 innodb中有IS/IX表级锁,以及自增锁(auto-inc) 读锁 加读锁后,只能对表读,不能对表写;允许多个会话同时读;其他会话可以加共享读锁 lock table table_name read 写锁 lock table table_name write 持有锁的会话可写可读 其他会话访问表或请求加锁都会被阻塞,直到锁释放 释放锁 unlock tables; lock table 锁不能相互嵌套,一个事务开始就意味着另外一个事务结束 显式开启一个事务,因为事务中不能支持表锁,所以事务开始则表锁断开 Kill或连接断开 innodb锁 默认为行锁 在索引上加锁来实现行锁 如果没有索引,那么升级为全表记录锁,最终效果等同于表锁

2019 最新 阿里天猫、蚂蚁、钉钉ava 面试题汇总,附答案

主宰稳场 提交于 2021-02-16 16:36:35
Java面试前需要做足各方面的准备工作,肯定都会浏览大量的面试题,本人也不例外,这是一些最新面试题,分享给大家。 Java基础 面向对象的特征:继承、封装和多态 int 和 Integer 有什么区别; Integer的值缓存范围 说说反射的用途及实现 Http 请求的 GET 和 POST 方式的区别 MVC设计思想 什么是Java序列化和反序列化; 如何实现Java序列化; 重载和重写的区别 进程和线程 线程和进程的概念 并行和并发的概念 创建线程的方式及实现 进程间通信的方式 说说 CountDownLatch、CyclicBarrier 原理和区别 说说 Semaphore 原理 说说 Exchanger 原理 ThreadLocal 原理分析; ThreadLocal为什么会出现OOM,出现的深层次原理 讲讲线程池的实现原理 线程池的几种实现方式 线程的生命周期;状态是如何转移的 锁机制 什么是线程安全?如何保证线程安全? 重入锁的概念;重入锁为什么可以防止死锁? 产生死锁的四个条件 如何检查死锁 volatile 实现原理 synchronized 实现原理(对象监视器) synchronized 与 lock 的区别 AQS 同步队列 CAS 无锁的概念;乐观锁和悲观锁 常见的原子操作类 什么是 ABA 问题;出现 ABA 问题 JDK 是如何解决的

《ODF走进名企之滴滴站:开源数据库最新发展技术之涓滴成河》邀您一起参加~~~

六眼飞鱼酱① 提交于 2021-02-16 13:10:31
滴滴作为一家科技驱动的创新企业,致力于回馈开发者社区、打造开源生态,建立企业创新品牌和技术领导力。目前,滴滴在开源项目上做了很多方面的探索和实践,积极参与业界的开源项目,不断对外输出内部的优秀项目。 《ODF走进名企之滴滴站:开源数据库最新发展技术之涓滴成河》邀您一起参加~~~ 滴滴开源的愿景 拥抱开放 - 通过主动开源,加速开放创新,构建开放生态圈。 创造价值 - 促进各领域的合作和技术发展,构建更多可扩展的产品。 合作共赢 - 共享技术,合作开发,将更好的技术带给世界,共同促进数字世界、智能世界的加速发展。 活动时间 2018年8月4日(周六) 14:00 - 18:00 活动地点 尚东数字山谷B区2号楼4层英菲尼迪会议室 日程安排 Time Table 13:30-13:55 活动签到 13:55-14:00 嘉宾致辞&主办方致辞 14:00-14:45 齐楠 《Redis多机房支持》 14:45-15:30 杜修文 《 MySQL InnoDB Cluster详解》 15:30-16:15 赵平 《流式处理实践之路》 16:15-16:30 茶歇 16:30-17:15 冯若航 《PostGIS在探探中的应用》 17:15-18:00 张冬洪 《Pedis 5.0 新特性解读 》 嘉宾议程 齐楠 | 滴滴基础架构部门高级专家工程师 现任滴滴基础架构部,负责队列,接入层

Linux云计算运维-MySQL

醉酒当歌 提交于 2021-02-16 05:39:50
0、建初心 优秀DBA的素质 1 、人品,不做某些事情 2 、严谨,运行命令前深思熟虑,三思而后行,即使是依据select 3 、细心,严格按照步骤一步一步执行,减少出错 4 、心态,遇到灾难,首先要稳住,不慌张,不要受到旁人的影响 5 、熟悉操作系统,Linux系统的工具和命令 6 、熟悉业务 ( 开发 ),编程语言 7 、熟悉行业 8 、喜欢数据库 • 什么是数据? 数据是指对客观事件进行记录并可以鉴别的符号,是对客观事物的性质、状态以及相互关系等进行记载的物理符号或这些物理符号的组合。它是可识别的、抽象的符号。 • 什么是数据库管理系统? 将大量的数据规范的管理在一起的软件 • 数据库管理系统种类 关系型和非关系型 • 关系型数据库的特点   – 二维表   – 典型产品 Oracle传统企业, MySQL是互联网企业   – 数据存取是通过SQL   – 最大特点,数据安全性方面强(ACID) • NoSQL:非关系型数据库(Not only SQL)   – 不是否定关系型数据库,做关系型数据库的的补充。   – 想做老大,先学会做老二。 RDBMS与NoSQL对比 • web1.0时代   企业提供内容,用户浏览,所以关系型数据库够用,并发并不高,所以不需要NoSQL。 • web2.0时代   核心是企业提供平台,用户参与提供内容。这时关系型数据库无法满足需求了。 •

FAQ系列 | 是什么导致MySQL数据库服务器磁盘I/O高?

我们两清 提交于 2021-02-15 04:51:21
0、导读 有个MySQL服务器的磁盘I/O总有过高报警,怎么回事? 1、问题 我的朋友小明,TA有个MySQL服务器最近总是报告磁盘I/O非常高,想着我这有免费的不用白不用的企业技术服务(TA自己这么想的),就找我帮忙给把把脉。 作为一个经验丰富(踩坑不断)的DBA,出现这种问题,一般来说,磁盘I/O很高无非是下面几个原因引起: 磁盘子系统设备性能差,或采用ext2/ext3之类文件系统,或采用cfq之类的io scheduler,所以IOPS提上不去; SQL效率不高,比如没有索引,或者一次性读取大量数据,所以需要更多的I/O; 可用内存太小,内存中能缓存/缓冲的数据不多,所以需要更多的I/O。 方法论已有,接下来就是动手开始排查了。 2、排查 先看磁盘I/O设备,是由十几块SSD组成的RAID 10阵列,按理说I/O性能应该不至于太差,看iops和%util的数据也确实如此。 再来看下文件系统、io scheduler的因素,发现采用xfs文件系统,而且io scheduler用的是noop,看来也不是这个原因。而且看了下iostat的数据,发现iops也不算低,说明I/O能力还是可以的。 再来看看当前的processlist,以及slow query log,也没发现当前有特别明显的slow query,所以也不是这个原因了。 现在只剩下内存不足这个因素了

FAQ系列 | 磁盘空间满了之后MySQL会怎样

白昼怎懂夜的黑 提交于 2021-02-15 04:30:15
导读 当磁盘空间爆满后,MySQL会发生什么事呢?又应该怎么应对? 会发生什么事 当磁盘空间写满了之后,MySQL是无法再写入任何数据的,包括对表数据的写入,以及binlog、binlog-index等文件。 当然了,因为InnoDB是可以把脏数据先放在内存里,所以不会立刻表现出来无法写入,除非开启了binlog,写入请求才会被阻塞。 当MySQL检测到磁盘空间满了,它会: 每分钟 :检查空间是否得到释放,以便写入新数据。当发现有剩余空间了,就会继续写入数据,一切照旧。 每十分钟 :如果还是发现没剩余空间,则会在日志中写入一条记录,报告磁盘空间满(这时候只写入几个字节还是够的)。 应该怎么办 那么,当发现磁盘空间满了之后,我们应该怎么处理呢,建议: 提高监控系统检测频率,预防再次发生; 及时删除不用的文件,释放空间; 若有线程因磁盘满的问题被阻塞了,可先杀掉,等到下一分钟重新检测时它可能又可以正常工作了; 可能因磁盘满导致某些线程被阻塞,引发其他线程也被阻塞,可把导致阻塞的线程杀掉,其他被阻塞的线程也就能继续工作了。 例外 有个例外的情况是: 当执行 REPAIR TABLE 或者 OPTIMIZE TABLE 操作时,或者执行完 LOAD DATA INFILE 或 ALTER TABLE 之后批量更新索引时,这些操作会创建临时文件

MySQL事务

我的未来我决定 提交于 2021-02-14 21:41:54
1. 为什么要有事务 事务广泛的运用于订单系统、银行系统等多种场景 例如: A用户和B用户是银行的储户,现在A要给B转账500元,那么需要做以下几件事: 检查A的账户余额>500元; A 账户中扣除500元; B 账户中增加500元; 正常的流程走下来,A账户扣了500,B账户加了500,皆大欢喜。 那如果A账户扣了钱之后,系统出故障了呢?A白白损失了500,而B也没有收到本该属于他的500。 以上的案例中,隐藏着一个前提条件:A扣钱和B加钱,要么同时成功,要么同时失败。事务的需求就在于此 所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。 例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。所以,应该把他们看成一个事务。事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据一致性 事务四大特性(简称ACID) 原子性(Atomicity) 一致性(Consistency) 隔离性(Isolation) 持久性(Durability) 以下内容出自《高性能MySQL》第三版,了解事务的ACID及四种隔离级有助于我们更好的理解事务运作。 下面举一个银行应用是解释事务必要性的一个经典例子。假如一个银行的数据库有两张表:支票表(checking)和储蓄表(savings)

mysql数据库优化大全

限于喜欢 提交于 2021-02-14 08:50:48
数据库优化 sql语句优化 索引优化 加缓存 读写分离 分区 分布式数据库(垂直切分) 水平切分 MyISAM和InnoDB的区别: 1. InnoDB支持事务,MyISAM不支持,对于InnoDB每一条SQL语言都默认封装成事务,自动提交,这样会影响速度,所以最好把多条SQL语言放在begin和commit之间,组成一个事务; 2. InnoDB支持外键,而MyISAM不支持。对一个包含外键的InnoDB表转为MYISAM会失败; 3. InnoDB不保存表的具体行数,执行select count(*) from table时需要全表扫描。而MyISAM用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快; 4. Innodb不支持全文索引,而MyISAM支持全文索引,查询效率上MyISAM要高; 5. 锁机制不同: InnoDB 为行级锁,myisam 为表级锁。 注意:当数据库无法确定,所找的行时,也会变为锁定整个表。 如: update table set num = 10 where username like “%test%”; 作者:Oscarwin 链接: https://www.zhihu.com/question/20596402/answer/211492971 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权