MyISAM

【建议收藏】MySQL 三万字精华总结 —锁机制和性能调优(四)

不羁岁月 提交于 2020-12-18 03:12:03
七、MySQL锁机制 ❝ 数据库的乐观锁和悲观锁? MySQL 中有哪几种锁,列举一下? MySQL中InnoDB引擎的行锁是怎么实现的? MySQL 间隙锁有没有了解,死锁有没有了解,写一段会造成死锁的 sql 语句,死锁发生了如何解决,MySQL 有没有提供什么机制去解决死锁 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。数据库锁定机制简单来说,就是数据库为了保证数据的一致性,而使各种共享资源在被并发访问变得有序所设计的一种规则。 打个比方,我们到淘宝上买一件商品,商品只有一件库存,这个时候如果还有另一个人买,那么如何解决是你买到还是另一个人买到的问题?这里肯定要用到事物,我们先从库存表中取出物品数量,然后插入订单,付款后插入付款表信息,然后更新商品数量。在这个过程中,使用锁可以对有限的资源进行保护,解决隔离和并发的矛盾。 锁的分类 从对数据操作的类型分类 : 读锁 (共享锁):针对同一份数据,多个读操作可以同时进行,不会互相影响 写锁 (排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁 从对数据操作的粒度分类 : 为了尽可能提高数据库的并发度,每次锁定的数据范围越小越好,理论上每次只锁定当前操作的数据的方案会得到最大的并发度,但是管理锁是很耗资源的事情

再谈mysql锁机制及原理—锁的诠释

陌路散爱 提交于 2020-12-18 00:52:13
加锁是实现数据库并发控制的一个非常重要的技术。当事务在对某个数据对象进行操作前,先向系统发出请求,对其加锁。加锁后事务就对该数据对象有了一定的控制,在该事务释放锁之前,其他的事务不能对此数据对象进行更新操作。 什么是锁? 锁是计算机协调多个进程或线程并发访问某一资源的机制 。 锁保证数据并发访问的一致性、有效性; 锁冲突也是影响数据库并发访问性能的一个重要因素。 锁是Mysql在服务器层和存储引擎层的的并发控制。 为什么要加锁 数据库是一个多用户使用的共享资源。当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 锁是用于管理对公共资源的并发控制。 也就是说在并发的情况下,会出现资源竞争,所以需要加锁。 加锁解决了 多用户环境下保证数据库完整性和一致性。 Lock的对象是事务,用来锁定的是数据库中的对象,如表、页、行。并且一般lock的对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同)。 锁分类 共享锁||读锁||S 锁(share lock):其他事务可以读,但不能写。允许一个事务去读一行,阻止其他事务获得相同数据集的排他锁。 排他锁||写锁||X 锁(exclusive) :其他事务不能读取,也不能写。允许获得排他锁的事务更新数据

MySQL高级知识(十三)——表锁

社会主义新天地 提交于 2020-12-18 00:52:01
前言:锁是计算机协调多个进程或线程并发访问某一资源的机制。在数据库中,除传统的计算机资源(如CPU、RAM、I/O等)的争用外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据并发访问性能的一个重要因素。从这个角度来说,锁对数据库而言显得尤其重要,也更加复杂。 1.锁的分类 #1.从对数据操作的类型来分 读锁(共享锁) 和 写锁(排它锁) #2.从对数据操作的粒度来分 表锁 和 行锁 2.表锁(偏读) 特点:偏向MyISAM存储引擎,开销小,加锁快,无死锁,锁定粒度大,发生锁冲突的概率最高,并发度低。下面通过案例来说明表锁的一些情况。 #1.创建mylock表,并插入5条数据。注意数据引擎使用的是 MyISAM 。 drop table if exists mylock; CREATE TABLE mylock ( id INT PRIMARY KEY auto_increment, name VARCHAR ( 20 ) NOT NULL ) ENGINE MyISAM DEFAULT charset = utf8; insert into mylock (name) values ( ' a ' ); insert into mylock (name) values ( ' b ' ); insert

MySQL 高级—— 锁机制

杀马特。学长 韩版系。学妹 提交于 2020-12-17 23:20:41
个人博客网: https://wushaopei.github.io/ (你想要这里多有) 一、锁的概述 1、锁的定义 锁是计算机协调多个进程或线程并发访问某一资源的机制。 在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外,数据也是一种供许多用户共享的资源。如何保证数据并发访问的一致性、有效性是所有数据库必须解决的一个问题,锁冲突也是影响数据库并发性能的一个重要因素。从这个角度来说,锁对于数据库而言显得尤其重要,也更加复杂。 2、应用场景 - - 生活购物 打个比方,我们到淘宝上买一件商品,商品只有一件库存,这个时候如果还有另一个人买, 那么如何解决是你买到还是另一个人买到的问题? ​ 这里肯定要用到事务,我们先从库存表中取出物品数量,然后插入订单,付款后插入付款表信息,然后更新商品数量。在这个过程中,使用锁可以对有限的资源进行保护,解决隔离和并发的矛盾。 3、锁的分类 3.1 从对数据 操作的类型 (读/写)分: 读锁、写锁 读锁(共享锁) : 针对同一份数据,多个读操作可以同时进行而不会互相影响 写锁(排它锁):当前写操作没有完成前,它会阻断其他写操作和读操作 3.2 从对数据 操作的粒度 分: 表锁、行锁 二、表锁 1、特点 偏向MyISAM存储引擎,开销小,加锁快;无死锁;锁定力度大,发生锁冲突的概率最高,并发度最低。 2、案例分析 2.1 建立SQL

彻底搞懂MySQL的索引

亡梦爱人 提交于 2020-12-16 17:00:50
前言 MyISAM和InnoDB是MySQL最常用的两个存储引擎,本文将进行详尽的介绍和对比。 对于MySQL其余几种存储引擎,请读者自行搜索学习。 本文会图解两种引擎的索引结构区别,然后讲解索引的原理,理解本文内容,就能够理解索引优化的各种原则的背后原因。 限于篇幅,本篇没有介绍的知识,会在后续博客将逐一讲解。 例如: MySQL引擎的锁机制、多列索引的生效规则、索引优化等主题。 下面SQL在本篇介绍引擎的结构区别时使用的表结构,便于读者更好理解。 CREATE TABLE `user` ( `id` int ( 11 ) NOT NULL AUTO_INCREMENT COMMENT ' 唯一码 ' , `age` int ( 5 ) NOT NULL COMMENT ' 年龄 ' , `name` varchar ( 5 ) NOT NULL COMMENT ' 名字 ' , PRIMARY KEY ( `id` ), KEY `name` ( `name` ) ) ENGINE = InnoDB AUTO_INCREMENT= 92 DEFAULT CHARSET =utf8mb4; B-树、B树和B-tree是同一个数据结构,只不过英语翻译过来之后,有些人误解了以为是多种树。 所以好多讲解树的数据结构的博客完全是误导初学者。 。 。 请读者认真分辨。

MySQL Bug剖析之Slave节点并行复制死锁

让人想犯罪 __ 提交于 2020-12-16 07:14:59
此文已由作者温正湖授权网易云社区发布。 欢迎访问 网易云社区 ,了解更多网易技术产品运营经验。 有天一早,DBA同学就找上来了,说有个DDB集群下的RDS实例Slave节点(从库)死锁了,请求支援。说实话,一大早就遇到死锁这种棘手的问题,我的内心是奔溃的。不过万幸的是,DBA说这个实例还未正式上线,处于上线前压测阶段。这么一来,至少现场可以一直保持着。方便定位问题。那么,是什么问题呢,不卖关子,直接上图: 这是show processlist的结果。可以看到有一大坨的连接,基本上都是权限操作相关的语句,全都卡在“waiting for table level lock”上。还有几个复制管理操作,比如stop slave,也卡住了。这密密麻麻一大堆,看得都烦。还是得从这些连接里面挖掘出少数有用的信息。所以登上实例的mysql客户端捋下才是王道。先看看有没有锁相关的直接信息: show engine innodb status\G ------------ TRANSACTIONS ------------ Trx id counter 6506046 Purge done for trx's n:o < 6506038 undo n:o < 0 state: running but idle History list length 2057 LIST OF TRANSACTIONS

mysql explain

你说的曾经没有我的故事 提交于 2020-12-14 22:21:07
explain SELECT `pname`,`attrname`,`parts_unit`,`parts_price` FROM `wy_parts` LEFT JOIN wy_parts_attribute ON wy_parts_attribute.partsid = wy_parts.partsid WHERE wy_parts_attribute.paid = '15'; id select_type table type possible_keys key key_len ref rows Extra SQL执行的顺序的标识,越大越先执行,如果说数字一样大,那么就从上往下依次执行 查询中每个select子句的类型 显示这一行的数据是关于哪张表的,有时不是真实的表名字,看到的是derivedx(x是个数字,我的理解是第几步执行的结果) 显示连接使用了何种类型。从最好到最差的连接类型为const(system)、eq_reg、ref、range、index和ALL(至少达到range级别最好能达到ref) 显示可能应用在这张表中的索引。如果为空,没有可能的索引 实际使用的索引 。如果为NULL,则没有使用索引。很少的情况下,MYSQL会选择优化不足的索引。这种情况下,可以在SELECT语句中使用USE INDEX(indexname)来强制使用一个possible

Mysql优化之explain你真的会吗?

坚强是说给别人听的谎言 提交于 2020-12-14 22:20:36
一、explain是什么? 1、 定义 EXPLAIN 是mysql中的一个命令,可以模拟优化器执行SQL语句并返回执行计划。通过执行计划,我们可以分析查询语句或表结构的性能瓶颈,从而进行SQL优化。 2、用法 mysql> explain select * from employee; +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+ | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra | +----+-------------+----------+------------+------+---------------+------+---------+------+------+----------+-------+ | 1 | SIMPLE | employee | NULL | ALL | NULL | NULL | NULL | NULL | 1 | 100.00 | NULL | +----+-------------

MySQL Memory--内存分配相关参数

限于喜欢 提交于 2020-12-13 14:42:30
Seesion级的内存分配: max_threads(当前活跃连接数) * ( read_buffer_size(顺序读缓冲,提高顺序读效率) + read_rnd_buffer_size(随机读缓冲,提高随机读效率) + sort_buffer_size(排序缓冲,提高排序效率) + join_buffer_size(表连接缓冲,提高表连接效率) + binlog_cache_size(二进制日志缓冲,提高二进制日志写入效率) + tmp_table_size(内存临时表,提高临时表存储效率) + thread_stack(线程堆栈,暂时寄存SQL语句 / 存储过程) + thread_cache_size(线程缓存,降低多次反复打开线程开销) + net_buffer_length(线程持连接缓冲以及读取结果缓冲) + bulk_insert_buffer_size(MyISAM表批量写入数据缓冲) ) global级的内存分配: global buffer(全局内存分配总和) = innodb_buffer_pool_size(InnoDB高速缓冲,行数据、索引缓冲,以及事务锁、自适应哈希等) +   innodb_additional_mem_pool_size(InnoDB数据字典额外内存,缓存所有表数据字典) +   innodb_log_buffer_size

MySQL索引和SQL调优手册

我是研究僧i 提交于 2020-12-12 15:56:37
01 MySQL索引 MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引。 MySQL官方对索引的定义为: 索引(Index)是帮助MySQL高效获取数据的数据结构。 提取句子主干,就可以得到索引的本质: 索引是数据结构。 02 MySQL索引原理 1、索引目的 索引的目的在于提高查询效率,可以类比字典,如果要查“mysql”这个单词,我们肯定需要定位到m字母,然后从下往下找到y字母,再找到剩下的sql。如果没有索引,那么你可能需要把所有单词看一遍才能找到你想要的,如果我想找到m开头的单词呢?或者ze开头的单词呢?是不是觉得如果没有索引,这个事情根本无法完成? 咱们去图书馆借书也是一样,如果你要借某一本书,一定是先找到对应的分类科目,再找到对应的编号,这是生活中活生生的例子,通用索引,可以加快查询速度,快速定位。 2、索引原理 所有索引原理都是一样的,通过不断的缩小想要获得数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是我们总是通过同一种查找方式来锁定数据。 数据库也是一样,但显然要复杂许多,因为不仅面临着等值查询,还有范围查询(>、<、between)、模糊查询(like)