MySQL
周一写bug,bug改一周
这个作者很懒,什么都没留下…
展开
-
悲观锁与乐观锁的原理和应用场景
至于悲观锁和乐观锁,也并不是 MySQL 或者数据库中独有的概念,而是并发编程的基本概念。主要区别在于,操作共享数据时,“悲观锁”即认为数据出现冲突的可能性更大,而“乐观锁”则是认为大部分情况不会出现冲突,进而决定是否采取排他性措施。反映到 MySQL 数据库应用开发中,悲观锁一般就是利用类似 SELECT … FOR UPDATE 这样的语句,对数据加锁,避免其他事务意外修改数据。乐观锁则与 Java 并发包中的 AtomicFieldUpdater 类似,也是利用 CAS 机制,并不会对数据加锁,而是原创 2020-12-15 16:10:05 · 198 阅读 · 0 评论 -
MySQL数据库语句、事务和索引调优
目录SQL语句调优慢SQL语句的诱因优化SQL语句的步骤常用的SQL优化索引调优事务调优并发事务带来的问题事务隔离解决并发问题锁具体实现算法优化高并发任务ACIDSQL语句调优慢SQL语句的诱因无索引、索引失效导致慢查询锁等待(MDL锁、行锁)等flush不恰当的SQL语句使用不恰当的 SQL 语句也是慢 SQL 最常见的诱因之一。例如,习惯使用 <SELECT >,<SELECT COUNT()> SQL 语句,在大数据表中使用 <LIMIT M,N>原创 2020-11-21 15:54:28 · 245 阅读 · 0 评论 -
通过 Show Profile 分析 SQL 执行性能
MySQL 是在 5.0.37 版本之后才支持 Show Profile 功能的,如果你不太确定的话,可以通过 select @@have_profiling 查询是否支持该功能。mysql> select @@have_profiling;+------------------+| @@have_profiling |+------------------+| YES |+------------------+查看是否开启此功能mysql> sele原创 2020-11-21 11:27:47 · 138 阅读 · 0 评论 -
MySQL重启后event_scheduler自动关闭的解决办法
问题描述: 在项目中需要用到event_scheduler定时器来实现每天更新前一天的统计总量,今天突然发现event_scheduler=OFF, 定时器event_scheduler被关闭了,后来查看了找到了原因:因为重启MySQL后event_scheduler自动设置为OFF,网上查阅了资料,收集以下两种方法,并且验证通过。1.手动开启‘event_scheduler’1.查看event_scheduler状态mysql> show variables like '%sch%';+--原创 2020-10-31 10:51:49 · 2448 阅读 · 0 评论 -
MySQL事务——隔离性
目录脏读、幻读和不可重复读脏读(读取未提交数据)不可重复读(前后多次读取,数据内容不一致)幻读(前后多次读取,数据总量不一致)事务隔离级别读未提交(Read uncommitted)读已提交(Read committed)可重复读(Repeatable read)可串行化(Serializable)总结脏读、幻读和不可重复读脏读(读取未提交数据)A事务读取B事务尚未提交的数据,此时如果B事务发生错误并执行回滚操作,那么A事务读取到的数据就是脏数据。就好像原本的数据比较干净、纯粹,此时由于B事务更改了它原创 2020-10-16 21:20:06 · 353 阅读 · 0 评论 -
日志模块:redo log和binlog
目录redo log为什么需要redo log概念binlogredo log 和binlog的区别更新语句的执行流程redo log为什么需要redo log因为Innodb是以页为单位进行磁盘交互的,而一个事务很可能只修改一个数据页里面的几个字节,这个时候将完整的数据页刷到磁盘的话,太浪费资源了!一个事务可能涉及修改多个数据页,并且这些数据页在物理上并不连续,使用随机IO写入性能太差!因此mysql设计了redo log,具体来说就是只记录事务对数据页做了哪些修改,这样就能完美地解决性能问原创 2020-10-15 15:02:22 · 326 阅读 · 0 评论 -
MySQL中delete、truncate和drop的作用及适用场景
Delete:用来删除表的全部或者一部分数据行。执行delete之后,用户需要提交(commmit)或者回滚(rollback)来执行删除或者撤销删除, delete命令会触发这个表上所有的delete触发器;Truncate删除表中的所有数据。这个操作不能回滚,也不会触发这个表上的触发器,TRUNCATE比delete更快,占用的空间更小;Drop命令从数据库中删除表,所有的数据行,索引和权限也会被删除,所有的DML触发器也不会被触发,这个命令也不能回滚。应用场景delete: 在想删除部分数据原创 2020-10-07 20:39:27 · 737 阅读 · 1 评论 -
MySQL储存过程
目录概念存储过程相关的SQL语句使用参数游标游标的使用步骤概念存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。存储过程相关的SQL语句查看数据库下的所有储存过程: show procedure status;查看指定的存储过程: show procedure status like “new_procedure”;查看存储过程或函数的创建代码:show create procedure proc_name;show原创 2020-09-24 21:09:25 · 145 阅读 · 0 评论 -
MySQL关系型数据库设计思路
目录主要的思路行列式第一范式:列的原子性,列不能再被分割第二范式:属性完全依赖于某个候选键第三范式:属性不依赖于其它非主属性E-R模型例子范式化和反范式化对比主要的思路二维表四个范式行列式其中,二维表很容易理解,二维即指行和列,不做细述,以下将详细讨论四个范式和工作中的业务问题。第一范式:列的原子性,列不能再被分割当表中字段存在可再分情况时,对其进行拆分,不满足第一范式。第二范式:属性完全依赖于某个候选键首先是 1NF,另外包含两部分内容,一是表必须有一个主键;二是没有包含在主键中原创 2020-09-24 17:31:05 · 294 阅读 · 0 评论 -
基础架构:SQL查询语句的执行流程
目录MySQL基础架构示意图连接器长连接和短连接查询缓存分析器优化器执行器MySQL基础架构示意图大体上,MySQL 分为 Server 层和存储引擎层两部分。Server 层: 包括连接器、查询缓存、分析器、执行器等,以及所有的内置函数(如日期、时间、数学和加密函数等)和跨存储引擎的功能(如存储过程、触发器、视图)。存储引擎层: 负责数据的存储和提取,支持 InnoDB、MyISAM、Memory 等多个存储引擎。MySQL 5.5.5 版本后默认存储存储引擎是 InnoDB。连接器在查询原创 2020-09-11 16:21:31 · 422 阅读 · 0 评论 -
什么情况会引发数据库的flush过程(把内存中的数据写入磁盘中)
目录flush过程的类比例子脏页和干净页什么情况会引发数据库的flush过程四种场景对性能的影响flush过程的类比例子InnoDB在处理更新语句的时候,只做了写日志这一个磁盘操作。《孔乙己》里咸亨酒店掌柜用来记账的粉板,在更新内存写完redo log后,就返回给客户端,本次更新成功。做下类比的话,掌柜记账的账本是数据文件,记账用的粉板是日志文件(redo log),掌柜的记忆就是内存。flush过程: 就是把内存里的数据写入磁盘的过程,对应是掌柜更新账本脏页和干净页脏页 当内存数据页跟磁盘数据原创 2020-09-11 11:36:10 · 835 阅读 · 0 评论 -
当要给字符串创建前缀索引时,如何确定我应该使用多长的前缀呢?
目录添加字符串索引和前缀索引使用前缀索引的缺点和优点如何确定使用多长的前缀添加字符串索引和前缀索引添加字符串索引: alter table SUser add index index1(email);在索引index1中包含每条记录的整个字符串添加前缀索引:alter table SUser add index index2(email(6));在index2 中对于每条记录只取前6字节使用前缀索引的缺点和优点缺点: 前缀索引可能会增加扫描行数,因为在前缀索引中前n个字节相同的情况下越少,扫描原创 2020-09-09 19:26:59 · 376 阅读 · 0 评论 -
第二篇:索引操作——查看、添加和删除索引
目录索引类型查看表中索引的基数创建索引利用alter table语句创建索引用 create index 语句创建索引删除索引索引类型UNIQUE(唯一索引): 不可以出现相同的值,可以有NULL值;INDEX(普通索引): 允许出现相同的索引内容;PROMARY KEY(主键索引): 不允许出现相同的值;fulltext index(全文索引): 可以针对值中的某个单词,但效率确实不敢恭维;组合索引: 实质上是将多个字段建到一个索引里,列值的组合必须唯一;查看表中索引的基数sql语句:原创 2020-09-09 17:27:07 · 183 阅读 · 0 评论 -
第一篇:登录MySQL、创建数据库及表、查看数据表的结构
目录登录数据库查看库、建库和删除库建表、删除表建表及删除查看表的结构登录数据库首先查看数据库的版本:mysql -Vsql语句:MySQL -h (sever_ip) -P (port) -u (username) -p说明:-h(sever_ip):服务器IP地址。本地可以写成:localhost或者127.0.0.1-P(port):端口号。一般默认为3306-u (username):用户名登录后查看MySQL的版本信息:select VERSION(), NOW(), USER(原创 2020-09-09 17:04:57 · 291 阅读 · 0 评论 -
show index from table查看表的索引基数
在终端中输入show index from dev,可以看到如下图所示Table:表名Non_unique:若为0则是唯一索引,为0是唯一索引Key_name:索引名称,若名称相同则是联合索引Seq_in_index:索引序列号,若是1表示从1开始Column_name:索引的列名Collation:字符序,'A’是升序排列Cardinality:基数,索引不同值得个数估计Sub_part:前置索引。如果列只是被部分地编入索引,则为被编入索引的字符的数目。如果整列被编入索引,则为NULL原创 2020-09-08 16:09:58 · 679 阅读 · 0 评论 -
MySQL限制数据的小数位数——DECIMAL类型
DECIMAL简介DECIMAL从MySQL 5.1引入,列的声明语法是DECIMAL(M,D)。NUMERIC与DECIMAL同义,如果字段类型定义为NUMERIC,则将自动转成DECIMAL。对于声明语法DECIMAL(M,D),自变量的值范围如下:M是最大位数(精度),范围是1到65。可不指定,默认值是10。 D是小数点右边的位数(小数位)。范围是0到30,并且不能大于M,可不指定,默认值是0。例如字段 salary DECIMAL(5,2),能够存储具有五位数字和两位小数的任何值,原创 2020-09-03 20:54:57 · 6827 阅读 · 0 评论