InnoDB

分分钟解决MySQL查询速度慢与性能差

爱⌒轻易说出口 提交于 2021-01-24 11:45:20
阅读本文大概需要 6 分钟。 一、什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: QueriesPerSecond 意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 TPS: 是 TransactionsPerSecond 的缩写,也就是事务数/秒。它是软件测试结果的测量单位。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。 Tips: 最好不要在主库上数据库备份,大型活动前取消这样的计划。 效率低下的 sql :超高的 QPS 与 TPS 。 大量的并发:数据连接数被占满( max_connection 默认 100 ,一般把连接数设置得大一些)。 并发量:同一时刻数据库服务器处理的请求数量 超高的 CPU 使用率: CPU 资源耗尽出现宕机。 磁盘 IO :磁盘 IO 性能突然下降、大量消耗磁盘性能的计划任务。解决:更快磁盘设备、调整计划任务、做好磁盘维护。 1.3 网卡流量:如何避免无法连接数据库的情况 减少从服务器的数量(从服务器会从主服务器复制日志) 进行分级缓存(避免前端大量缓存失效) 避免使用 select* 进行查询 分离业务网络和服务器网络 1.4 大表带来的问题( 重要 ) 1.4.1 大表的特点

专业解决 MySQL 查询速度慢与性能差

半世苍凉 提交于 2021-01-24 10:40:26
一、什么影响了数据库查询速度 1.1 影响数据库查询速度的四个因素 1.2 风险分析 QPS: Queries Per Second 意思是“每秒查询率”,是一台服务器每秒能够相应的查询次数,是对一个特定的查询服务器在规定时间内所处理流量多少的衡量标准。 TPS: 是 TransactionsPerSecond 的缩写,也就是事务数/秒。它是软件测试结果的测量单位。客户机在发送请求时开始计时,收到服务器响应后结束计时,以此来计算使用的时间和完成的事务个数。 Tips: 最好不要在主库上数据库备份,大型活动前取消这样的计划。 效率低下的 sql :超高的 QPS 与 TPS 。 大量的并发:数据连接数被占满( max_connection 默认 100 ,一般把连接数设置得大一些)。 并发量:同一时刻数据库服务器处理的请求数量 超高的 CPU 使用率: CPU 资源耗尽出现宕机。 磁盘 IO :磁盘 IO 性能突然下降、大量消耗磁盘性能的计划任务。解决:更快磁盘设备、调整计划任务、做好磁盘维护。 1.3 网卡流量:如何避免无法连接数据库的情况 减少从服务器的数量(从服务器会从主服务器复制日志) 进行分级缓存(避免前端大量缓存失效) 避免使用 select * 进行查询 分离业务网络和服务器网络 1.4 大表带来的问题( 重要 ) 1.4.1 大表的特点 记录行数巨大,单表超千万

Does transaction release insert intention lock after insertion?

老子叫甜甜 提交于 2021-01-24 09:48:52
问题 After executing the below code, create table t(id int primary key); insert into t values (5),(10); -- session 1 start transaction; select * from t where id > 8 for share; -- session 2 start transaction; insert into t values(6); -- is blocked the output of select * from performance_schema.data_locks is: +--------+---------------------------------------+-----------------------+-----------+----------+---------------+-------------+----------------+-------------------+------------+----------------

MySQL中varchar与char区别

╄→尐↘猪︶ㄣ 提交于 2021-01-23 11:41:02
一. varchar存储规则:   4.0版本以下,varchar(20),指的是20字节,如果存放UTF-8汉字时,只能存6个(每个汉字3字节)   5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF-8汉字(每个汉字3字节),都可以存放20个字符 Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同。 二. varchar和char 的区别:    区别1:定长和变长      char 表示定长,长度固定,varchar表示变长,即长度可变。当所插入的字符串超出它们的长度时,视情况来处理,如果是严格模式,则会拒绝插入并提示错误信息,如果是宽松模式,则会截取然后插入。如果插入的字符串长度小于定义长度时,则会以不同的方式来处理,如char(10),表示存储的是10个字符,无论你插入的是多少,都是10个,如果少于10个,则用空格填满。而varchar(10),小于10个的话,则插入多少个字符就存多少个。    区别:2:存储的容量不同     对 char 来说,最多能存放的字符个数 255,和编码无关。 而 varchar 呢,最多能存放 65532 个字符。VARCHAR 的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532(65535-3=65532

MySQL 基础知识梳理学习(七)----sync_binlog

怎甘沉沦 提交于 2021-01-23 06:47:59
一般在生产环境中,很少用MySQL单实例来支撑业务,大部分的MySQL应用都是采用搭建集群的方法。搭建MySQL集群,可以进行数据库层面的读写分离、负载均衡或数据备份。基于MySQL原生的Replication是最常见的保证数据库安全的机制,满足数据库的高可用,在数据库发生宕机的情况后,其他节点还能快速提供服务,并且数据库的数据不丢失。 Binlog是用来保存数据库修改的日志信息。一般的主从复制都是基于Binlog的,Binlog的安全直接关系到主从复制的安全,而Binlog的写入方式主要由参数sync_binlog来控制。参数取值主要如下: 参数取值 影响的行为 sync_binlog=0 事务提交时,MySQL将Binlog信息写入到Binlog文件(OS Cache)中,但是MySQL不控制Binlog的刷盘操作,由文件系统自己控制其缓存的刷新。缺点是,一旦操作系统宕机,在Binlog cache中的所有Binlog都会丢失。如果只是数据库宕机,而操作系统不宕机,那么数据库所生成的Binlog都不会丢失。 sync_binlog=1 每一个事务提交时,MySQL都会把Binlog刷新到磁盘中,这样,数据库的安全性最高。缺点是,性能损耗是最大的。此设置可以保证,在数据库或者操作系统宕机的情况下,二进制日志中缺少的任何事务也只能处于准备阶段,那么导致服务器自动恢复时

MySQL 基础知识梳理

时间秒杀一切 提交于 2021-01-23 06:35:50
MySQL 的安装方式有多种,但是对于不同场景,会有最适合该场景的 MySQL 安装方式,下面就介绍一下 MySQL 常见的安装方法,包括 rpm 安装,yum 安装,通用二进制安装以及源码编译安装,以 CentOS6.9 操作系统为例。 一、rpm 安装 安装速度较快,通常适用于企业中大规模部署 mysql,安装步骤如下: (1)首先下载 MySQL 的 rpm 安装包, 如下: 客户端: http://dev.mysql.com/get/Down… 服务端: http://dev.mysql.com/get/Down… (2)下载完成之后,上传至服务器的指定软件目录下,比如:/home/software; (3)首先查看主机上是否已经安装过 mysql,使用如下命令查看: [root@WB-BLOG ~]# rpm -qa | grep -i mysql* (4)如果存在,需要先卸载原有 mysql,使用如下命令: [root@WB-BLOG ~]# rpm -e --nodeps mysql-libs 注:–nodeps 表示无依赖卸载 mysql-libs,防止卸载依赖的库而导致后续安装出错 (5)添加 mysql 用户: [root@WB-BLOG software]# useradd mysql -s /sbin/nologin -M (6)卸载完成之后,开始安装

MySQL 基础知识梳理学习(四)----GTID

点点圈 提交于 2021-01-23 05:32:47
在日常运维中,GTID带来的最方便的作用就是搭建和维护主从复制。GTID的主从模式代替了MySQL早期版本中利用二进制日志文件的名称和日志位置的做法,使用GTID使操作和维护都变得更加简洁和可高。 1.GTID的优点 (1)基于GTID搭建主从复制根据简单。 (2)可以确保每个事务只会被执行一次。 (3)可以方便的实现Replication的Failover,不需要像传统模式复制那样去找master_log_file和master_log_pos。 (4)GTID在MGR中也发挥了中要作用。MGR各节点之间复制依赖于GTID,并且在集群节点进行Recover重新加入到集群的操作中,会选择其中一个节点作为Donor,然后基于Purged的GTID开始同步数据。MGR还是通过GTID进行冲突验证,用于跟踪每个实例上提交的事务,确定哪些事务可能有冲突。 2.使用GTID搭建主从时,需要注意的MySQL参数。 (1)server_id: 设置MySQL实例的server_id,每个实例的server_id不能一样。 (2)gtid_mod=ON: MySQL实例开启GTID模式。 (3)enforce_gtid_consitency=ON: 使用GTID模式复制时,需要开启此参数,用来保证GTID的一致性。 (4)log-bin: MySQL必须开启Binlog。 (5)log-slave

理解完这些基本上能解决面试中MySql的事务问题

放肆的年华 提交于 2021-01-22 10:02:15
越努力,越幸运, 本文已收藏在Gitee中JavaCommunity, 里面有面试分享、源码分析系列文章,欢迎收藏,点赞 https://gitee.com/JavaCommunity/JavaCommunity 前言 在面试中,基本上都会问到关于数据库的事务问题,如果啥都不会或者只回答到表面的上知识点的话,那面试基本上是没戏了,为了能顺利通过面试,那MySql的事务问题就需要了解,所以就根据网上的资料总结一版Mysql事务的知识点,巩固一下事务的知识。 事务 事务是指逻辑上的一组操作,要么都执行,要么都不执行, 事务的特性(ACID) 原子性( Atomicity ):事务是不可分割的工作单元,要么都成功,要么都失败, 如果事务中一个sql语句执行失败,则已执行的语句也必须回滚,数据库退回到事务前的状态。 一致性( Consistency ):事务不能破坏数据的完整性和业务的一致性 。例如在银行转账时,不管事务成功还是失败,双方钱的总额不变 隔离性( Isolation ):一个事务所操作的数据在提交之前,对其他事务的可见性设定(一般是不可见) 持久性( Durability ):事务提交之后,所做的修改就会永久保存,不会因为系统故障导致数据丢失 严格来说,只有同时满足数据库的事务ACID特性才能算一个完整的事务,但现实中实现能够真正满足的完整的事务特性少之又少

Materialize MySQL引擎:MySQL到Click House的高速公路

霸气de小男生 提交于 2021-01-21 12:35:32
摘要: MySQL到ClickHouse数据同步原理及实践 引言 熟悉MySQL的朋友应该都知道,MySQL集群主从间数据同步机制十分完善。令人惊喜的是,ClickHouse作为近年来炙手可热的大数据分析引擎也可以挂载为MySQL的从库,作为MySQL的 "协处理器" 面向OLAP场景提供高效数据分析能力。早先的方案比较直截了当,通过第三方插件将所有MySQL上执行的操作进行转化,然后在ClickHouse端逐一回放达到数据同步。终于在2020年下半年,Yandex 公司在 ClickHouse 社区发布了MaterializeMySQL引擎,支持从MySQL全量及增量实时数据同步。MaterializeMySQL引擎目前支持 MySQL 5.6/5.7/8.0 版本,兼容 Delete/Update 语句,及大部分常用的 DDL 操作。 基础概念 MySQL & ClickHouse MySQL一般特指完整的MySQL RDBMS,是开源的关系型数据库管理系统,目前属于Oracle公司。MySQL凭借不断完善的功能以及活跃的开源社区,吸引了越来越多的企业和个人用户。 ClickHouse是由Yandex公司开源的面向OLAP场景的分布式列式数据库。ClickHouse具有实时查询,完整的DBMS及高效数据压缩,支持批量更新及高可用。此外

利用Redis锁解决高并发问题

為{幸葍}努か 提交于 2021-01-21 07:55:14
这里我们主要利用 Redis 的 setnx 的命令来处理高并发。有个问题,setnx需要配合expire来设置时间,这样就不再是原子性的,还有个更好的办法,使用set来进行锁操作set后面有nx等参数来进行原子操作会更好 setnx 有两个参数。第一个参数表示键。第二个参数表示值。如果当前键不存在,那么会插入当前键,将第二个参数做为值。返回 1 。如果当前键存在,那么会返回 0 。 创建库存表 CREATE TABLE `storage` ( `id` int( 11) unsigned NOT NULL AUTO_INCREMENT, ` number ` int(11) DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE =InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 设置初始库存为10 创建订单表 CREATE TABLE `order` ( `id` int( 11) unsigned NOT NULL AUTO_INCREMENT, ` number ` int(11) DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE =InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1 测试不用锁的时候 $pdo = new