MyISAM

Mysql中的锁机制详解

删除回忆录丶 提交于 2020-01-11 14:33:11
原文: MySQL中的锁(表锁、行锁,共享锁,排它锁,间隙锁) 作者: 唐大麦 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的 计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一 个问题,锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。本章我们着重讨论MySQL锁机制 的特点,常见的锁问题,以及解决MySQL锁问题的一些方法或建议。 Mysql用到了很多这种锁机制,比如行锁,表锁等,读锁,写锁等,都是在做操作之前先上锁。这些锁统称为悲观锁(Pessimistic Lock)。 MySQL锁概述 相对其他数据库而言,MySQL的锁机制比较简单,其最 显著的特点是不同的存储引擎支持不同的锁机制。比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁。 表级锁: 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁: 开销大,加锁慢;会出现死锁

mysql学习笔记之数据库引擎

☆樱花仙子☆ 提交于 2020-01-10 14:36:32
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> -- 查看数据库支持的存储引擎 show engines; MyISAM 在磁盘上攒簇三个文件,文件名和对应的表名是一致的 frm文件:存储表的定义数据。 myd文件:存放表具体记录数据。 myi文件:存储索引。 MyISAM存储引擎不支持事务,也不支持主键,对数据的存储和批量查询的速度比较快。 在实际应用中,往往对于不需要完整的事务,主要以查询和增加记录为主的应用采用myisam存储引擎(日志) innodb是第三方公司开发的,目前应用最广泛的数据存储引擎除了满意三之外就是innodb了,innodb写的处理相对于myisam效率低一些,innodb牺牲了存储和查询的效率,支持事务安全,支持自动增长列,对于输完液安全的支持,这是innodb成为myisam最为流行的存储器引擎之一的重要原因。 外键约束 innodb实现了外键这一数据库重要功能,从数据库性能上讲数据库外键降低了数据库查询的效率,数据库表之间的耦合度更加紧密,但是对于不少用户来讲,采用外键约束可能是低成本的选择方式 来源: oschina 链接: https://my.oschina.net/u/3914215/blog/3155842

干货|一次MySQL两千万数据大表的优化过程,三种解决方案!

会有一股神秘感。 提交于 2020-01-10 11:21:45
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 问题概述 使用阿里云rds for MySQL数据库(就是MySQL5.6版本),有个用户上网记录表6个月的数据量近2000万,保留最近一年的数据量达到4000万,查询速度极慢,日常卡死。严重影响业务。 问题前提:老系统,当时设计系统的人大概是大学没毕业,表设计和sql语句写的不仅仅是垃圾,简直无法直视。原开发人员都已离职,到我来维护,这就是传说中的维护不了就跑路,然后我就是掉坑的那个!!! 我尝试解决该问题,so,有个这个日志。 方案概述 以上三种方案,按顺序使用即可,数据量在亿级别一下的没必要换nosql,开发成本太高。三种方案我都试了一遍,而且都形成了落地解决方案。该过程心中慰问跑路的那几个开发者一万遍 :) 方案一详细说明:优化现有mysql数据库 跟阿里云数据库大佬电话沟通 and Google解决方案 and 问群里大佬,总结如下(都是精华): 1.数据库设计和表创建时就要考虑性能 2.sql的编写需要注意优化 3.分区 4.分表 5.分库 1.数据库设计和表创建时就要考虑性能 mysql数据库本身高度灵活,造成性能不足,严重依赖开发人员能力。也就是说开发人员能力高,则mysql性能高。这也是很多关系型数据库的通病,所以公司的dba通常工资巨高。 设计表时要注意: 1.表字段避免null值出现

面试之mysql

萝らか妹 提交于 2020-01-10 00:15:41
1.数据库三范式是什么? a.第一范式:字段具有原子性、不可再分(所有关系型数据库都满足) b.第二范式:需满足第一范式,要求数据库表中的每个实例或行可以被唯一区分。 c.第三范式:需满足第二范式,要求一个数据库表,不包含已在其它表中包含的非主关键字信息 2.优化相关 a.用PreparedStatement,一般来说比Statement性能高 b.有外键约束会影响插入和删除性能,如果程序能保证数据完整性,设计数据库时就去掉外键 c.表种允许冗余. d.union all 要比 union快很多 ,所以不考虑重复数据和排序的话 使用union all 3.索引种类 a.普通索引:针对数据库表创建的索引 b.唯一索引:与普通索引类似,不同的是数据库索引列的值必须唯一, 允许空 c.主键索引:特殊的索引,不允许空,在建表时同时创建主键索引 d.组合索引:讲数据库表中的多个字段,联合起来 组成一个 组合索引. 4.索引的工作机制 a.数据库索引,是数据库管理系统中的 一个排序的数据结构,用于协助快速查询、更新数据库表中的数据。 索引的实现通常使用的是B树及其变种B+树。 5.myisam与 innodb的区别 a.事物:myisam特点是性能,每次查询具有原子性,其执行速度比innodb类型快,不支持事物。innodb提供事物支持,commit、rollback b.锁:innodb

2020面试题

試著忘記壹切 提交于 2020-01-09 17:36:13
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 基础 JVM内存模型(堆、方法区、本地方法栈、JVM栈、程序计数器) GC回收方式(计数器、可达性分析等) 类加载器(AppClassLoader、ExtClassLoader、BootstrapClassLoader) OSI七层模型(物理层->数据链路层->网络层->传输层->会话层->表现层->应用层) 设计模式(单例模式、观察者模式、装饰者模式、工厂模式、代理模式) HashMap实现原理(JDK1.8) 分布式调度任务流程(XX-JOB):任务注册->任务下发->监控->日志信息收集 算法题(斐波那契数列、杨辉三角形、字符串123变为数字123) 多线程 1.validate 实现原理:将缓存的最新值更新到内存中,同时通知其他处理器,从内存中重新取值,此时其他处理器的缓存值失效 应用场景:插入内存屏障,防止指令重排序 目的:实现共享变量的可见性 2.transient 目的:防止不必要的变量序列化 3.syncronized 实现原理:反编译源码中存在监控计数器,线程获取锁时->计数器+1,锁释放时->计数器-1.当其他线程得知计数器为0时,线程可以进入,否则,线程需要等待. 应用场景:锁(可重入) 备注:reetrantLock是jdk5引入的并发包,作用类似于syncronized

Mysql备份与恢复(1)---物理备份

淺唱寂寞╮ 提交于 2020-01-09 13:35:12
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 数据库对企业来说最重要的莫过于其中的数据,所以做好数据库的备份是一个不可或缺的工作。数据库及时备份可以帮助我们在数据库出现异常宕机时及时的使用备份数据进行恢复工作,将因为数据库宕机产生的影响降低到最小。所以,本篇文章主要数据库数据备份与恢复进行介绍。由于MyISAM存储引擎中备份数据是将表保存到单独的文件所以比较简单,所以这里我主要针对InnoDB存储引擎介绍备份与恢复机制。 全量备份与增量备份的区别 全量备份: 每次备份都进行全量备份,所以如果数据量大的情况下,进行全量备份会消耗较多的时间且对数据库压力比较大,但是由于全量备份每次都是最新的备份,所以恢复数据的时候效率更快。 增量备份: 只备份每天增量的日志,所以备份时效率更高对数据库压力也较小,但是恢复回复数据时就需要从全量备份日志加上每天的增量日志去进行恢复数据,所以恢复数据效率比较低。 **Mysql数据备份大致分为2类:**物理备份与逻辑备份。本篇文章我们先看看物理备份。 物理备份 物理备份分为热备份和冷备份。 冷备份 冷备份是最简单的备份方式,其实就是在备份数据时停掉Mysql服务,然后将data目录下的数据文件拷贝到备份地址进行存储。当Mysql出现宕机时,将备份文件拷贝到data目录替换即可完成数据恢复。但是一般情况下不使用冷备份的方式

mysql索引实现原理

旧城冷巷雨未停 提交于 2020-01-09 11:00:23
一、什么是索引?为什么要建立索引? 索引用于快速找出在某个列中有一特定值的行,不使用索引,MySQL必须从第一条记录开始读完整个表,直到找出相关的行,表越大,查询数据所花费的时间就越多,如果表中查询的列有一个索引,MySQL能够快速到达一个位置去搜索数据文件,而不必查看所有数据,那么将会节省很大一部分时间。 例如:有一张person表,其中有2W条记录,记录着2W个人的信息。有一个Phone的字段记录每个人的电话号码,现在想要查询出电话号码为xxxx的人的信息。如果没有索引,那么将从表中第一条记录一条条往下遍历,直到找到该条信息为止。如果有了索引,那么会将该Phone字段,通过一定的方法进行存储,好让查询该字段上的信息时,能够快速找到对应的数据,而不必在遍历2W条数据了。 其中 MySQL 中的索引的存储类型有两种: BTREE 、 HASH 。 也就是用树或者Hash值来存储该字段,要知道其中详细是如何查找的,就需要会算法的知识了。我们现在只需要知道索引的作用,功能是什么就行。 二、MySQL中索引的优点和缺点和使用原则    优点:    1、所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段设置索引    2、大大加快数据的查询速度    缺点:    1、创建索引和维护索引要耗费时间,并且随着数据量的增加所耗费的时间也会增加    2、索引也需要占空间

mysql 索引优化 btree hash rtree

天涯浪子 提交于 2020-01-09 01:20:50
【推荐】2019 Java 开发者跳槽指南.pdf(吐血整理) >>> 一:mysql里目前只支持4种索引分别是:b-tree,full-text,hash以及r-tree索引 b-tree索引应该是mysql里最广泛的索引的了,除了archive,基本所有的存储引擎都支持它. 1.b-tree在myisam里的形式和innodb稍有不同 在innodb里面有两种形态:其一是primary key形态其leaf node里存放的是数据.而且不仅存放了索引键的数据,还存放了其他字段的数据.其二是secondary index,其leaf node和普通的b-tree差不多,只是还存放了指向主键的信息. 而在myisam里,主键和其他的并没有太大区别.不过和innodb不太一样的地方是,在myisam里,leaf node里存放的不是主键的信息,存的是指向数据文件里的对应数据行的信息. 2.hash索引,目前我所知道的就只有memory和ndb cluster支持这种索引. hash索引由于其结构,所以在每次查询的时候直接一次到位不行b-tree那样,一点点的前进,所以hash索引的效率高于b-tree.但hash也有缺点,主要如下: (1)由于存放的是hash值,所以仅支持<=>以及in操作. (2)hash索引无法通过操作索引来排序,这是因为存放的时候经过hash计算

MySQL必知存储引擎

家住魔仙堡 提交于 2020-01-08 22:21:30
Mysql存储引擎 1.MyISAM MySQL 5.0 之前的默认数据库引擎,最为常用。拥有较高的插入,查询速度,但不支持事务. 2.InnoDB事务型数据库的首选引擎,支持ACID事务,支持行级锁定, MySQL 5.5 起成为默认数据库引擎. 3.BDB源 自 Berkeley DB,事务型数据库的另一种选择,支持Commit 和Rollback 等其他事务特性 4.Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在 MySQL 重新启动时丢失 5.Merge将一定数量的 MyISAM 表联合而成一个整体,在超大规模数据存储时很有用 6.Archive非常适合存储大量的独立的,作为历史记录的数据。因为它们不经常被读取。Archive 拥有高效的插入速度,但其对查询的支持相对较差 7.Federated将不同的 MySQL 服务器联合起来,逻辑上组成一个完整的数据库。非常适合分布式应用 8.Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用 9.CSV 逻辑上由逗号分割数据的存储引擎。它会在数据库子目录里为每个数据表创建一个 .csv 文件。这是一种普通文本文件,每个数据行占用一个文本行。CSV 存储引擎不支持索引。 10

MySQL存储引擎MyISAM和InnoDB

拟墨画扇 提交于 2020-01-07 23:36:26
存储引擎概念介绍 MySQL中的数据用各种不同的技术存储在文件中,每一种技术都使用不同的存储机制、索引技巧、锁定水平并最终提供不同的功能和能力,这些不同的技术以及配套的功能在MySQL中称为存储引擎 存储引擎就是MySQL将数据存储在文件系统中的存储方式或者存储格式————因此适用的场景也不一样 目前MySQL常用的两种存储引擎 MyISAM InnoDB 存储引擎:一种基础的驱动力,存储技术:存储机制、索引技巧、锁定水平。 mysql存储引擎是mysql数据库服务器中的组建,负责为数据库执行实际的数据I/O操作 使用特殊存储的主要优点之一在于:仅需要提供特殊应用所需的特性,数据库中的系统开销较小,具有更有效和更高的数据库性能 mysql系统中,存储引擎处于文件系统之上,在数据保存到数据文件之前会传输到存储引擎,之后按照各个存储引擎的存储格式进行储存 前后端的开发语言去提取拿取数据,这就需要装驱动,,具体的对象叫connector连接者 connection pool 叫连接池,类似所谓的空闲的线程或者进程去进行连接,在里面回房多个被连接对象,以备连接,并且节省响应时间,优化访问效率 使用线程或者进程去连接,链接需要媒介载体,就是sock通信文件,以提供pid文件,所有的线程都需要sock文件去管理, 数据放在磁盘上,在逻辑层面上放在file system 中