MyISAM

MySQL:行锁、表锁、乐观锁、悲观锁、读锁、写锁

别说谁变了你拦得住时间么 提交于 2020-12-23 03:13:12
1、锁的分类   1.1从对数据操作的类型来分     读锁(共享锁): 针对同一份数据,多个读操作可以同时进行而不会互相影响。           结论1:       --如果某一个会话 对A表加了read锁,则 该会话 可以对A表进行读操作、不能进行写操作; 且 该会话不能对其他表进行读、写操作。       --即如果给A表加了读锁,则当前会话只能对A表进行读操作。       结论2:       会话0给A表加了锁;其他会话的操作:a.可以对其他表(A表以外的表)进行读、写操作       b.对A表:读-可以; 写-需要等待释放锁。、         某回话给某个表加了读锁,所有的回话都能对该表进行读操作,不能进行写操作,除非该会话释放读锁。      写锁(排它锁) :当前写操作没有完成前,它会阻断其他写锁和读锁。           当前会话(会话0) 可以对加了写锁的表 进行任何操作(增删改查);但是不能 操作(增删改查)其他表       其他会话:对会话0中加写锁的表 可以进行增删改查的前提是:等待会话0释放写锁 2.2 从 锁粒度划分。 一般分为:行锁、表锁、库锁 (1)行锁: 访问数据库的时候,锁定整个行数据,防止并发错误。 如InnoDB存储引擎使用行锁 (2) 表锁 : 访问数据库的时候,锁定整个表数据,防止并发错误。 如MyISAM存储引擎使用表锁

MySQL中的存储过程、函数与触发器

心不动则不痛 提交于 2020-12-22 07:13:47
一.对待存储过程和函数的态度 优点: 1.存储过程只在创建时进行编译,sql语句则每次执行都需要编译。能提高数据库执行速度。 2.简单复杂操作结合事物一起封装。 3.复用性高。 4.安全性高,可指定存储过程的使用权。 在 实际项目中应该尽量少用存储过程和函数 ,理由如下: 1. 移植性差 ,在MySQL中的存储过程移植到sqlsever上就不一定可以用了。 2. 调试麻烦 ,在db中报一个错误和在应用层报一个错误不是一个概念,那将是毁灭性打击,直接一个error:1045什么的更本毫无头绪。 3. 扩展性不高 。 所以在互联网时代大型项目应该尽量少使用(不使用)存储过程和函数。 二.创建存储过程 2.1什么是存储过程? 存储过程和存储函数都是一组sql语句的集合。这些语句集合被当做一个整体存入数据库中。 2.2创建存储过程的语法: create procedure 存储过程名(参数列表) sql语句 例子: delimiter // create procedure pro() reads sql data begin select * from stu; end 那么我们现在就有一个存储过程pro了,但是这个存储过程他是没有参数的,他只是执行一次查询操作。 我们现在来讲解一下这个存储过程的结构: delimiter // 是将分号转化为// 因为在sql执行时当他遇到分号 ;

全网最全 | MySQL EXPLAIN 完全解读

北城余情 提交于 2020-12-22 04:23:45
点击上方 IT牧场 ,选择 置顶或者星标 技术干货每日送达! EXPLAIN作为MySQL的性能分析神器,读懂其结果是很有必要的,然而我在各种搜索引擎上竟然找不到特别完整的解读。都是只有重点,没有细节(例如type的取值不全、Extra缺乏完整的介绍等)。 所以,我肝了将近一个星期,整理了一下。这应该是全网最全面、最细致的EXPLAIN解读文章了,下面是全文。 文章比较长,建议收藏。 TIPS 本文基于MySQL 8.0编写,理论支持MySQL 5.0及更高版本。 EXPLAIN使用 explain可用来分析SQL的执行计划。格式如下: {EXPLAIN | DESCRIBE | DESC} tbl_name [col_name | wild] {EXPLAIN | DESCRIBE | DESC} [explain_type] {explainable_stmt | FOR CONNECTION connection_id} {EXPLAIN | DESCRIBE | DESC} ANALYZE select_statement explain_type: { FORMAT = format_name } format_name: { TRADITIONAL | JSON | TREE } explainable_stmt: { SELECT statement | TABLE

一千个不用 Null 的理由!

霸气de小男生 提交于 2020-12-19 14:45:39
https://my.oschina.net/leejun200 港真,Null 貌似在哪里都是个头疼的问题,比如 Java 里让人头疼的 NullPointerException,为了避免猝不及防的空指针异常,千百年来程序猿们不得不在代码里小心翼翼的各种 if 判断,麻烦而又臃肿,为此 java8 引入了 Optional 来避免这一问题。 下面咱们要聊的是 MySQL 里的 null,在大量的 MySQL 优化文章和书籍里都提到了字段尽可能用NOT NULL,而不是NULL,除非特殊情况。但却都只给结论不说明原因,犹如鸡汤不给勺子一样,让不少初学者对这个结论半信半疑或者云里雾里。本文今天就详细的剖析下使用 Null 的原因,并给出一些不用 Null 的理由。 1、NULL 为什么这么多人用? NULL是创建数据表时默认的,初级或不知情的或怕麻烦的程序员不会注意这点。 很多人员都以为not null 需要更多空间,其实这不是重点。 重点是很多程序员觉得NULL在开发中不用去判断插入数据,写sql语句的时候更方便快捷。 2、是不是以讹传讹? MySQL 官网文档: NULL columns require additional space in the rowto record whether their values are NULL. For MyISAM tables,

震惊,小白看了都知道的!!Mysql6000w数据表的查询优化到0.023S

柔情痞子 提交于 2020-12-19 11:02:37
前言 很抱歉现在才把这篇文章发出来,这几天事情比较多,周四把任务完成才得空写一写,闲话不多说请看下↓↓↓ 详细需求 需求: 系统中有一个专门存车流量的库(没有主键),其中一个历史表数据量太大,表空间占据太大,每天有500w的数据写入,然后老大给我安排了个任务,让我写个按天分表的定时任务,每次把一天的数据转移到按天生成的表中,并删除原表中的数据,主要目的是不想再增长表空间了,保持一个平衡,因为每天删500w也会加500w 表空间和数据量: 实现思路 我本人实现的做法流程,如图 实现伪代码(删减了部分代码): /** * 转移数据 每天凌晨3点 每次只能转移一天的数据 */ @Scheduled ( cron = "0 0 3 * * ?" ) public void dataTransfer ( ) throws Exception { System . out . println ( "定时器开始运行------------------------------------------" ) ; String tabaleName = "XXX" ; String isTable = getTableName ( tabaleName ) ; // 当返回为空时,代表该表不存在,则创建 if ( ObjectUtils . isNull ( isTable ) ) {

SQL与MySQL基本

余生颓废 提交于 2020-12-18 19:13:58
一:概念辨析 数据库(database):是一种保存有组织的数据的容器。 数据库软件(DBMS):使用DBMS操作数据库、访问数据库。 SQL:结构化查询语言,专门用来与数据库通信的语言。几乎所有DBMS都支持SQL,用以操作数据库。但是不同DBMS实现的sql不完全相同。 MySQL:MySQL是一种DBMS,是一种数据库软件。通过它我们可以创建、操作数据库,可以执行SQL语句进行数据库信息的增删查改。 客户端与服务器:DBMS基于客户端——服务器模式。 服务器 软件运行在担任数据库服务器的计算机上, 负责所有数据访问与处理 。而关于数据处理的请求则是来自客户端, 客户端可以是MySQL的命令行工具、可视化操作工具、脚本语言、程序设计语言等 。 二:MySQL前期操作 1:连接到数据库服务器 通过 主机名、端口、用户名、口令 来连接到数据库服务器。 mysql -u 用户名 -p 2:选择数据库 USE 数据库名; 3:显示数据库 show databases; 4:获取一个数据库中所有表 show tables; 5:显示一个表中所有列 SHOW COLUMS FROM 表名; 6:显示服务器状态信息 SHOW STATUS; 7:显示用于权限 SHOW GRANTS 8:显示警告或错误信息 SHOW ERRORS SHOW WARNINGS 三

必看!PHP常见面试题——MySQL篇(一)

怎甘沉沦 提交于 2020-12-18 12:55:35
1. 说说自己对于 MySQL 常见的两种存储引擎:MyISAM与InnoDB的理解? InnoDB 引擎: InnoDB 引擎提供了对数据库 acid 事务的支持,并且还提供了行级锁和外键的约束,它的设计的目标就是处理大数据容量的数据库系统。MySQL 运行的时候,InnoDB 会在内存中建立缓冲池,用于缓冲数据和索引。但是该引擎是不支持全文搜索,同时启动也比较的慢,它是不会保存表的行数的,所以当进行 select count() from table 指令的时候,需要进行扫描全表。由于锁的粒度小,写操作是不会锁定全表的,所以在并发度较高的场景下使用会提升效率的。 MyIASM 引擎: MySQL 的默认引擎,但不提供事务的支持,也不支持行级锁和外键。因此当执行插入和更新语句时,即执行写操作的时候需要锁定这个表,所以会导致效率会降低。不过和 InnoDB 不同的是,MyIASM 引擎是保存了表的行数,于是当进行 select count() from table 语句时,可以直接的读取已经保存的值而不需要进行扫描全表。所以,如果表的读操作远远多于写操作时,并且不需要事务的支持的,可以将 MyIASM 作为数据库引擎的首选。 2. 谈谈你对MySQL索引的理解? MySQL索引使用的数据结构主要有BTree索引 和 哈希索引 。对于哈希索引来说,底层的数据结构就是哈希表

MySQL面试总结

假如想象 提交于 2020-12-18 07:01:35
MySQL面试总结 # MySQL的存储引擎 `MyISAM`(默认表类型):非事务的存储引擎,基于传统的`ISAM`(有索引的顺序访问方法)类型,是存储记录和文件的标准方法,不是事务安全,不支持外键,适用于频繁的查询。表锁,不会出现死锁,适合小数据和小并发。 - 为什么不会出死锁?(没有事务就不会继续持有锁) 答:因为`MyISAM`再查询的时候,会同时锁定这个`sql`里面所有用到的表(获取锁的顺序是一致的),不局限与一张表,再写锁又重叠时,就得等待。 **注意:【`MySQL5.5`之前默认的是`MyISAM`引擎了,5.5之后的版本默认都是`innodb`作为存储引擎】** `innodb`:支持事务安全的存储引擎,适用于插入和更新,支持外键,行锁,事务。适合大数据,大并发。特别是针对多个并发和`QPS`较高的情况。 - `QPS:`就是每秒查询率,`QPS`是对一个特定服务器再规定时间内能处理多少流量的衡量标准。 - `TPS:`就是每秒传输处理的事务个数。 - `innodb`的行锁模式:共享锁,排他锁,意向共享锁(表锁),意向排他锁(表锁),间隙锁。(注意:如果`sql`语句没有使用索引,`innodb`不能确定操作的行时,使用意向锁(表锁))。 - 死锁问题 - 什么是死锁? 死锁就是当俩个事务都需要获取对方持有的排他锁才能完成事务的时候,就导致了循环锁等待

三万字打造 91 道 MySQL 面试题【建议收藏】

戏子无情 提交于 2020-12-18 03:18:08
原 文: https://blog.csdn.net/ThinkWon/article/details/104778621 数据库基础知识 1. 为什么要使用数据库 数据保存在内存 优点:存取速度快 缺点:数据不能永久保存 数据保存在文件 优点:数据永久保存 缺点:1)速度比内存操作慢,频繁的IO操作。2)查询数据不方便 数据保存在数据库 1)数据永久保存 2)使用SQL语句,查询方便效率高。 3)管理数据方便 2. 什么是SQL? 结构化查询语言(Structured Query Language)简称SQL,是一种数据库查询语言。 作用:用于存取数据、查询、更新和管理关系数据库系统。 3. 什么是MySQL? MySQL是一个关系型数据库管理系统,由瑞典MySQL AB 公司开发,属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一,在 WEB 应用方面,MySQL是最好的 RDBMS (Relational Database Management System,关系数据库管理系统) 应用软件之一。在Java企业级开发中非常常用,因为 MySQL 是开源免费的,并且方便扩展。 4. 数据库三大范式是什么 第一范式:每个列都不可以再拆分。 第二范式:在第一范式的基础上,非主键列完全依赖于主键,而不能是依赖于主键的一部分。 第三范式:在第二范式的基础上

【建议收藏】MySQL 三万字精华总结 —索引(二)

核能气质少年 提交于 2020-12-18 03:17:45
四、索引 ❝ 说说你对 MySQL 索引的理解? 数据库索引的原理,为什么要用 B+树,为什么不用二叉树? 聚集索引与非聚集索引的区别? InnoDB引擎中的索引策略,了解过吗? 创建索引的方式有哪些? 聚簇索引/非聚簇索引,mysql索引底层实现,为什么不用B-tree,为什么不用hash,叶子结点存放的是数据还是指向数据的内存地址,使用索引需要注意的几个地方? MYSQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构,所以说 索引的本质是:数据结构 索引的目的在于提高查询效率,可以类比字典、 火车站的车次表、图书的目录等 。 可以简单的理解为“排好序的快速查找数据结构”,数据本身之外, 数据库还维护者一个满足特定查找算法的数据结构 ,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。下图是一种可能的索引方式示例。 左边的数据表,一共有两列七条记录,最左边的是数据记录的物理地址。 为了加快Col2的查找,可以维护一个右边所示的二叉查找树,每个节点分别包含索引键值,和一个指向对应数据记录物理地址的指针,这样就可以运用二叉查找在一定的复杂度内获取到对应的数据,从而快速检索出符合条件的记录。 索引本身也很大,不可能全部存储在内存中, 一般以索引文件的形式存储在磁盘上 平常说的索引,没有特别指明的话