mysql数据库

Mysql事务

|▌冷眼眸甩不掉的悲伤 提交于 2020-03-08 21:06:12
1.什么是事务 事务是一条或多条数据库操作语句的组合,具备ACID四个特点。 原子性(Atomicity): 一个事务要么全部执行,要么全部不执行。也就是说一个事务不可能执行到一半就停止了。比如:去超时购买商品,付钱和拿到商品这两步要么同时执行,要么都不执行。 一致性(Consistency): 指事务的运行不会改变数据库中数据的一致性。比如:a+b=10,a改变了,b也应该随之变化。 隔离性(Isolation): 一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是个例的,并发执行的各个事务之间不能相互干扰。 持久性(Durability): 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的。 事务并发会发生什么问题? 脏读 一个事务在执行的过程中读取到了其他事务还没有提交的数据。 不可重复读 事务A在读取一条记录时,这个事务还没有结束,事务B对这个记录进行修改,事务A再次读取这条记录时,记录发生了变化。也就是事务A两次读取到的数据发生了变化成为不可重复读。 幻读 事务A读取表中的数据,事务B在事务A还没有结束时,进行了插入操作,事务A再次读取,发现表中有新的数据,就好像发生了幻觉一样。 事务的隔离级别: 隔离级别分为四种: 读未提交:READ-UNCOMMITTED 读已提交:READ

高性能MySQL 第六章

浪尽此生 提交于 2020-03-08 20:25:18
查询优化、索引优化、库表结构优化需要齐头并进,一个不落,才能最终设计出在实际场景中能发挥良好效果的方案。 为什么查询速度会慢? 如果把查询看作是一个任务,那么它由一系列子任务组成,每个子任务都会消耗一定的时间。如果要优化查询,实际上要优化其子任务,要么雄楚其中一些子任务,要么减少子任务的执行次数,要么让任务运行得更快。 如何优化数据访问? 1、确认是否向数据库请求了不需要的数据 2、确认 MySQL 是否在扫描额外的记录 3、确认查询的方式,并予以合适的重构 当希望 MySQL 能够以更高的性能运行查询时,最好的办法就是弄清楚 MySQL 是如何优化和执行查询的。一旦理解这一点,很多查询优化工作实际上就是遵循一些原则让优化器能够按照预想的合理的方式运行。 那么,当 MySQL 执行一个查询时,MySQL 到底做了什么? 1、客户端发送一条查询给服务器 2、服务器先检查查询缓存,如果命中了魂村,则立刻返回存储在魂村中的结果。否则进入下一阶段。 3、服务器端进行 SQL 解析、预处理,再由优化器生成对应的执行计划 4、MySQL 根据优化器生成的执行计划,条用存储引擎的 API 来执行查询 5、将结果返回给客户端 来源: https://www.cnblogs.com/stone94/p/12444491.html

IntelliJ IDEA 连接 MySQL 数据库

≯℡__Kan透↙ 提交于 2020-03-08 18:34:52
一、在 IDEA 中添加 MySQL DataBase PS:在此之前请先下载好 MySQL 和配置好环境变量。 我这里已经下载好了,因为 IntelliJ IDEA 和 PyCharm 和 CLion 这里的操作的相同的。所以我这里用 CLion 来演示,操作完全一样! 1. 打开 CLion(或IDEA)进入Data Source 2. 下载驱动文件 点开之后就来到了这里 PS:这里直接点击“Download”也是可以下载驱动文件的。 3. 设置本地用户 二、下载 MySQL 驱动 jar 包 [法一] 直接 MySQL 官网下载 官网驱动下载地址:https://dev.mysql.com/downloads/connector/j/ [法二] 使用 Maven 下载 如果是用 Maven 建立工程的话,那么可以用 Maven 来下载 jar 包,非常方便(建议学会这种方法)。 我这里的版本是 MySQL 8.0.19,添加的依赖如下: < dependency > < groupId > mysql </ groupId > < artifactId > mysql-connector-java </ artifactId > < version > 8.0.19 </ version > </ dependency > △ 如何找到自己想要的依赖代码呢? 可以直接在

数据库部分 面经集合

大兔子大兔子 提交于 2020-03-08 18:21:18
1、Mysql 主键是什么概念 “主键(PRIMARY KEY)”的完整称呼是“主键约束”。MySQL 主键约束是 一个列或者列的组合 ,其值能 唯一地标识表中的每一行。 这样的一列或多列称为表的主键,通过它可以强制表的实体完整性。 2、主键和索引的关系与区别 主键一定是唯一性索引,唯一性索引并不一定就是主键。 一个表中可以有多个唯一性索引,但只能有一个主键。 主键列不允许空值,而唯一性索引列允许空值。 主键和索引都是键,不过主键是逻辑键,索引是物理键,意思就是 主键不实际存在,而索引实际存在数据库中 3、 MyISAM与Innodb MySQL有多种存储引擎,每种存储引擎有各自的优缺点,比较常用的是 MyISAM 与 Innodb: Innodb 支持事务,支持外键;MyISAM 都不支持。 MyISAM 适合查询以及插入为主的应用,其索引和数据是分开的,而且其索引是压缩的,可以更好地利用内存。所以它的查询性能明显优于INNODB。压缩后的索引也能节约一些磁盘空间。 InnoDB 事务型数据库的首选引擎,支持事务安全表(ACID),支持行锁定和外键。MySQL 5.5.5 之后,InnoDB 作为默认存储引擎。 4、辅助索引、聚集索引与非聚集索引 索引是关系型数据库中给数据库表中一列或多列的值排序后的存储结构,数据库的主流索引结构有 B+ 树以及 Hash 结构,B

2. 影响mysql性能的因素

我的梦境 提交于 2020-03-08 17:32:57
影响mysql性能的几个方面: 1. 服务器硬件 2. 服务器操作系统 3. 数据库存储引擎 4. 数据库参数配置 5. 数据库结构设计和SQL语句 服务器硬件: 1. CPU: CPU密集型的应用,应选用频率更高的CPU而不是更多的CPU WEB类的应用,CPU核心数量比频率重要 2. 内存: 内存越多越好,内存对读、写都有作用 内存频率越高速度越快,应选择主板支持的最大内存频率,单条容量尽可能大 3. 磁盘: 传统机器硬盘:1.存储容量 2.传输速度 3.访问时间 4.主轴转速 5.物理尺寸 RAID(磁盘冗余阵列): 1.RAID 0,2块以上的硬盘组成,没有冗余和错误修复能力 2.RAID 1,磁盘镜像,2块硬盘组成,有冗余 3.RAID 5,分布式奇偶性校验阵列,3块以上的硬盘组成,任意一个盘数据失效时可以重建,更多盘数据失效时无法重建 4.RAID 10,分片镜像,RAID 0和RAID 1组合,4块以上的硬盘组成,对比RAID 5重建更简单,速度更快 固态存储SSD或PCI-E卡: 比机械硬盘有更好的随机读写性能 比机械硬盘能更好的支持并发 比机械硬盘更容易损坏 适用于存在大量随机I/O的场景 适用于解决单线程负载的I/O瓶颈 网络存储SAN和NAS: SAN的随机读写慢,不如本地RAID磁盘 NAS设备使用网络连接,通过基于文件的协议如NFS或SMB来访问

mysql两个重要的日志redolog和binlog

泪湿孤枕 提交于 2020-03-08 16:45:38
一.redo log 使用原因 在 MySQL 里有这个问题,如果每一次的更新操作都需要写进磁盘,然后磁盘也要找到对应的那条记录,然后再更新,整个过程 IO 成本、查找成本都很高 其实就是 MySQL 里经常说到的 WAL 技术,WAL 的全称 是 Write-Ahead Logging,它的关键点就是先写日志,再写磁盘 当有一条记录需要更新的时候,InnoDB 引擎就会先把记录写到 redo log里面,并更新内存,这个时候更新就算完成了。同时,InnoDB 引擎会在适当的时候,将这个操作记录更新到磁盘里面,而这个更新往往是在系统比较空闲的时候做 原理 InnoDB 的 redo log 是固定大小的,比如可以配置为一组 4 个文件,每个文 件的大小是 1GB,那么这块“粉板”总共就可以记录 4GB 的操作。从头开始写,写到末 尾就又回到开头循环写,如上面这个图所示。 write pos 是当前记录的位置,一边写一边后移,写到第 3 号文件末尾后就回到 0 号文件 开头。checkpoint 是当前要擦除的位置,也是往后推移并且循环的,擦除记录前要把记录 更新到数据文件。 write pos 和 checkpoint 之间的是“粉板”上还空着的部分,可以用来记录新的操作。如 果 write pos 追上 checkpoint,表示“粉板”满了,这时候不能再执行新的更新,得停下

linux环境中mysql数据库的安装

。_饼干妹妹 提交于 2020-03-08 14:31:40
安装环境:系统是 centos6.5 1、下载     下载地址:http://dev.mysql.com/downloads/mysql/5.6.html#downloads     下载版本:我这里选择的5.6.33,通用版,linux下64位     也可以直接复制64位的下载地址,通过命令下载:wget http://dev.mysql.com/get/Downloads/MySQL-5.6/mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz 2、解压 #解压 tar -zxvf mysql-5.6.33-linux-glibc2.5-x86_64.tar.gz #复制解压后的mysql目录 cp -r mysql-5.6.33-linux-glibc2.5-x86_64 /usr/local/mysql 3、添加用户组和用户 #添加用户组 groupadd mysql #添加用户mysql 到用户组mysql useradd -g mysql mysql 4、安装 cd /usr/local/mysql/<br>mkdir ./data/mysql chown -R mysql:mysql ./ ./scripts/mysql_install_db --user=mysql --datadir=/usr/local/mysql/data

高性能MySQL之锁详解

感情迁移 提交于 2020-03-08 12:07:19
原文: 高性能MySQL之锁详解 一、背景 MySQL里面的锁大致可以分成全局锁、表级锁和行锁三类。数据库锁的设计的初衷是处理并发问题。我们知道多用户共享资源的时候,就有可能会出现并发访问的时候,数据库就需要合理的控制资源的访问规则,因此,锁就应运而生了,它主要用来实现这些访问规则的重要数据结构。 二、全局锁 顾名思义,全局锁就是对整个数据库实例加锁,可以通过命令 Flush tables with read lock (FTWRL)对整个数据库实例子加锁。让整个库处于只读状态的时候,可以使用这个命令,之后其他线程的以下语句会被阻塞:数据更新语句(数据的增删改)、数据定义语句(包括建表、修改表结构等)和更新类事务的提交语句。 全局锁有一个经典的使用场景就是做全库逻辑备份,也就是说吧整个数据库的每个表都用select 出来存成文本。以前有一种做法是通过FTWRL确保不会有其他线程对数据库做更新,然后对整个库做备份。注意,在备份过程中整个库完全处于只读状态。 你此时是不是觉得很危险? 如果你在主库上备份,那么在备份期间都不能执行更新,业务基本上就得停摆; 如果你在从库上备份,那么备份期间从库不能执行主库同步过来的binlog,会导致主从延迟。 看上去确实很危险,但是我们细想一下,备份为什么要加锁呢?如果我们不加锁又会出现什么问题呢? 假设你现在要维护京东的购买系统

Mysql数据查询

纵然是瞬间 提交于 2020-03-08 11:56:51
Mysql查询 数据多次过滤 条件:from、where、group by、having、distinct、order by、limit => 层层筛选后的结果 查: select [distinct] 字段1 [[as] 别名1],...,字段n [[as] 别名n] from [数据库名.]表名 [条件]; 注:一条查询语句,可以拥有多种筛选条件,条件的顺序必须按照上方顺序进行逐步筛选,distinct稍有特殊(书写位置),条件的种类可以不全 可以缺失,但不能乱序 单表查询 distinct 去重 数据为: +------+------+ | x | y | +------+------+ | 1 | 2 | | 2 | 3 | | 3 | 4 | | 1 | 2 | +------+------+ #执行 select distinct * from t1; +------+------+ | x | y | +------+------+ | 1 | 2 | | 2 | 3 | | 3 | 4 | +------+------+ # 总结:distinct对参与查询的所有字段,整体去重(所查的全部字段的值都相同,才认为是重复数据) 常用函数 拼接:concat() | concat_ws() 大小写:upper() | lower() 浮点型操作:ceil() |

mysql 操作总结 INSERT和REPLACE

若如初见. 提交于 2020-03-08 11:42:08
--他人总结的 用于操作数据库的SQL一般分为两种,一种是查询语句,也就是我们所说的SELECT语句,另外一种就是更新语句,也叫做数据操作语句。 言外之意,就是对数据进行修改。在标准的SQL中有3个语句,它们是INSERT、UPDATE以及DELETE。在MySQL中又多了一个REPLACE语句,因此,本文以MySQL为背景来讨论如何使有SQL中的更新语句。   一、INSERT和REPLACE   INSERT和REPLACE语句的功能都是向表中插入新的数据。这两条语句的语法类似。它们的主要区别是如何处理重复的数据。   1. INSERT的一般用法   MySQL中的INSERT语句和标准的INSERT不太一样,在标准的SQL语句中,一次插入一条记录的INSERT语句只有一种形式。   INSERT INTO tablename(列名…) VALUES(列值);   而在MySQL中还有另外一种形式。   INSERT INTO tablename SET column_name1 = value1, column_name2 = value2,…;   第一种方法将列名和列值分开了,在使用时,列名必须和列值的数一致。如下面的语句向users表中插入了一条记录:   INSERT INTO users(id, name, age) VALUES(123, '姚明', 25);