InnoDB

码农必备SQL高性能优化指南!35+条优化建议立马get

半世苍凉 提交于 2020-08-18 23:33:46
由于工作需要,最近做了很多 BI 取数的工作,需要用到一些比较高级的 SQL 技巧,总结了一下工作中用到的一些比较骚的进阶技巧,特此记录一下,以方便自己查阅,主要目录如下: SQL 的书写规范 SQL 的一些进阶使用技巧 SQL 的优化方法 SQL 的书写规范 在介绍一些技巧之前,有必要强调一下规范,这一点我发现工作中经常被人忽略,其实遵循好的规范可读性会好很多,应该遵循哪些规范呢 1、 表明要有意义,且标准 SQL 中规定表名的第一个字符应该是字母。 2、注释,有单行注释和多行注释,如下 多行注释很多人不知道,这种写法不仅可以用来添加真正的注释,也可以用来注释代码,非常方便 3、缩进 就像写 Java,Python 等编程语言一样 ,SQL 也应该有缩进,良好的缩进对提升代码的可读性帮助很大,以下分别是好的缩进与坏的缩进示例 4、空格 代码中应该适当留有一些空格,如果一点不留,代码都凑到一起, 逻辑单元不明确,阅读的人也会产生额外的压力,以下分别是是好的与坏的示例 5、大小写 关键字使用大小写,表明列名使用小写,如下 花了这么多时间强调规范,有必要吗,有!好的规范让代码的可读性更好,更有利于团队合作,之后的 SQL 示例都会遵循这些规范。 SQL 的一些进阶使用技巧 1、巧用 CASE WHEN 进行统计 来看看如何巧用 CASE WHEN 进行定制化统计,假设我们有如下的需求

double write(二次写)

徘徊边缘 提交于 2020-08-18 17:29:10
文章目录 1.1 什么是double write 1.2 double write原理 1.3 double write恢复流程 1.4 doublewrite的负载 1.5 相关参数 1.1 什么是double write   MySQL的数据页默认是16K,而文件系统的数据页是4K,IO操作是按页为单位就行读写的。这就可能出现数据库对一个16k的数据页修改后,操作系统开始进行写磁盘,但是在这个过程中数据库宕机导致没有完全将16K数据页写到磁盘上。数据库重启后,校验数据页,发现有数据页不完整,就起不来了(redo是基于完整数据页进行的恢复)。   为了解决这个问题,MySQL引入了double write这个特性。double write针对的是脏数据,提高innodb的可靠性,用来解决部分写失败(partial page write)。为了数据的持久性,脏数据需要刷新到磁盘上,而double write就产生在将脏数据刷盘的过程中。刷盘是一份脏数据写到共享表空间ibdata中,一份写到真正的数据文件永久的保存。写了两次脏数据,就叫double wriete。 1.2 double write原理   简单来说,double write就是将修改后的脏页先放到double write buffer区,这个区占用2M内存空间,buffer空间满或其他条件触发,使double

Mariadb之半同步复制集群配置

早过忘川 提交于 2020-08-18 15:08:47
  首先我们来了解下在mariadb/mysql数据库主从复制集群中什么是同步,什么是异步,什么是半同步;所谓同步就是指主节点发生写操作事件,它不会立刻返回,而是等到从节点接收到主节点发送过来的写操作事件,并在从节点完成重放后,从节点返回一个重放完成的消息给主节点,然后主节点才返回,这种叫同步;简单讲就是主节点要等从节点把写操作重放完成后再接收到从节点发来的重放完成消息后,然后返回告诉客户端;异步指的是在主节点发生写操作后,它只管把写操作产生的事件,写入到自己的二进制日志中后,就返回客户端;它不会等从节点重放完成;这种叫异步;默认情况mariadb/mysql主从复制集群就是这种异步同步的方式进行;半同步指的是在主节点发生写操作事件后,它会把该操作的事件发送给从节点,当从节点接收到主节点发送过来的事件后,就立刻告诉主节点,从节点已经接收到主节点发送过来的事件,此时主机点并不会等到从节点重放完成,而是接收到从节点接收到主节点发送过去的的事件确认消息后,就返回给客户端;而在mariadb/mysql主从复制集群中的半同步,并不是我们刚才说的这种半同步机制;在mariadb/mysql主从复制集群中的半同步指的是,一主多从的复制集群中,一个从节点或一部分从节点和主节点是同步复制,一部分从节点是异步复制;   配置mariadb半同步复制   在mariadb/mysql中

2020网易严选java实习生一面凉经

空扰寡人 提交于 2020-08-18 14:38:04
jMM 可见性,解释一下原理 volatile 数据可见实现原理,内存屏障原理 happens-before了解吗?介绍一下 双亲委派模型介绍 CopyOnWriteArrayList为什么是线程安全的 mysql事务隔离级别,默认是什么 mysql事务什么时候会发生死锁 innoDB MVCC 索引,给一个索引查询例子,解释有什么不同 gc垃圾回收机制了解吗?用什么命令可以对java内存进行分析 设计模式 介绍一个听都没听过的设计模式。。。 面向对象设计原则,里氏替换介绍 Spring Ioc介绍 怎么利用git进行协作 介绍一下你的项目,有什么难点或遇到比较困难的地方 有什么要问的 来源: oschina 链接: https://my.oschina.net/u/4317114/blog/4504547

Mysql事务

孤人 提交于 2020-08-18 07:53:30
事务的四大特性ACID 场景:小明向小强转账10元 原子性(Atomicity) 转账操作是一个不可分割的操作,要么转失败,要么转成功,不能存在中间的状态,也就是转了一半的这种情况。我们把这种要么全做,要么全不做的规则称之为原子性。 隔离性(Isolation) 另外一个场景: 小明向小强转账10元 小明向小红转账10元 隔离性表示上面两个操作是不能相互影响的 一致性(Consistency) 对于上面的转账场景,一致性表示每一次转账完成后,都需要保证整个系统的余额等于所有账户的收入减去所有账户的支出。 如果不遵循原子性,也就是如果小明向小强转账10元,但是只转了一半,小明账户少了10元,小强账户并没有增加,所以没有满足一致性了。 同样,如果不满足隔离性,也有可能导致破坏一致性。 所以说,数据库某些操作的原子性和隔离性都是保证一致性的一种手段,在操作执行完成后保证符合所有既定的约束则是一种结果。 实际上我们也可以对表建立约束来保证一致性。 持久性(Durability) 对于转账的交易记录,需要永久保存。 事务的概念 我们把需要保证原子性、隔离性、一致性和持久性的一个或多个数据库操作称之为一个事务 事务的使用 开启事务 方式一: BEGIN WORK BEGIN语句代表开启一个事务,后边的单词WORK可有可无。开启事务后,就可以继续写若干条语句,这些语句都属于刚刚开启的这个事务

基于X-Engine引擎的实时历史数据库解决方案揭秘

对着背影说爱祢 提交于 2020-08-18 06:48:08
实时历史库需求背景 在当今的数字化时代,随着业务的迅速发展,每天产生的数据量会是一个惊人的数量,数据库存储的成本将会越来越大,通常的做法是对历史数据做归档,即将长期不使用的数据迁移至以文件形式存储的廉价存储设备上,比如阿里云OSS或者阿里云数据库DBS服务。 然而在部分核心业务的应用场景下,针对几个月甚至几年前的“旧”数据依旧存在实时的,低频的查询甚至更新需求,比如淘宝/天猫的历史订单查询,企业级办公软件钉钉几年前的聊天信息查询,菜鸟海量物流的历史物流订单详情等。 • 如果这时从历史备份中还原后查询,那么查询时间将会是以天为单位,可接受度为0 • 如果将这些低频但实时的查询需求的历史数据与近期活跃存储在同一套分布式数据库集群下,那么又会带来以下两大挑战 存储成本巨大,进而导致成本远大于收益,比如钉钉聊天信息数据量在高度压缩后接近50PB,很难想象这些数据不做压缩会带来多大的资金开销 性能挑战巨大,随着数据量越来越大,即使针对数据做了分布式存储,单实例容量超过大概5T以后性能也会急剧下滑,进而影响到近期活跃数据的查询性能,拖垮整个集群 运维难度巨大,比如针对海量数据下发一个表数据结构变更操作,很难想象全部完成需要多长时间 实时历史库场景需求分析 通过上面的分析,不管是冷备份还是在线历史数据混合存储在同一张物理表上的方法都是不可取的,一般实时查询历史数据库的场景

MySQL去重保留最大的那条记录(取最新的记录)

我与影子孤独终老i 提交于 2020-08-18 05:38:20
以用户登录日志表为例,取用户最近登录的设备 1 SET NAMES utf8mb4; 2 SET FOREIGN_KEY_CHECKS = 0 ; 3 4 -- ---------------------------- 5 -- Table structure for t_login_log 6 -- ---------------------------- 7 DROP TABLE IF EXISTS ` t_login_log ` ; 8 CREATE TABLE ` t_login_log ` ( 9 ` id ` int( 11 ) NOT NULL AUTO_INCREMENT, 10 ` user_id ` int( 11 ) NOT NULL COMMENT '用户ID' , 11 ` device_name ` varchar( 32 ) COLLATE utf8mb4_bin NOT NULL COMMENT '登录设备' , 12 ` login_time ` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '登录时间' , 13 PRIMARY KEY ( ` id ` ) 14 ) ENGINE = InnoDB AUTO_INCREMENT =

面试题千变万化,为什么总是会问MySQL?

谁说胖子不能爱 提交于 2020-08-18 05:33:48
前言 当你简历上写了 熟悉mysql关系型数据库时,那肯定免不了面试官对于myql索引.事务,慢查询等等的考察 那么到底什么是索引,索引的数据类型有哪些,它们的优缺点以及如何去排查那些慢SQL语句等,虚都莫虚,下面都给各位安排安排 面试开始 面试官 : 我看你简历上写了熟悉mysql,那谈谈你是如何筛选出慢mysql语句呢? 是它,是它,就是它,慢查询日志,这个时候你肯定要把主动权掌握在自己手里了,只要面试官不说停,谁拉我都绝对不能停下来的 深吸一口气,开始你对面试官最深情的告白 首先可以先通过 show variables like ‘slow_query%’ 来确定慢查询是否开启,如果没有则通过 set global slow_query_log=‘ON’ 开启慢查询 其次我们可以设置慢查询日志的位置( set global slow_query_log_file )和设置超过多少秒( set global long_query_time )记录下慢sql, 这样就可以在指定的目录下查看日志,从而找出慢sql语句. 这个时候好像第一个问题已经回答完了,但是停是不可能停下来的,一辈子都不可能 慢sql的原因有很多,其中典型的就是表的数据量太大,查询的时候走了全表查询从而导致查询时间长,这个时候我们可以给一些数据量大的表添加索引,当然也可以通过 set global log

SSD硬盘配置最佳实践

不打扰是莪最后的温柔 提交于 2020-08-18 05:30:35
本文原创作者杜霆,京东商城基础平台部MySQL DBA,经作者同意发表于本人博客,如需转载需经本人同意。 一、测试背景 服务器升级SSD后,速度和性能没有得到应有的提升,原因是没有正确使用SSD,主要是raid、linux、mysql数据库等相关参数没有正确的配置,本文对SSD的相关参数进行了对比性能测试,根据相关资料以及测试结果得出相关结论,了解实用场景以及对应优势。 二、测试环境 主机:172.20.166.52 Cpu:32 * Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz 内存:129G 操作系统:CentOS release 6.6 Sysbench:Sysbench 0.5 SSD硬盘:800G*6 raid5 主机:172.20.166.23 Cpu:32 * Intel(R) Xeon(R) CPU E5-2650 v2 @ 2.60GHz 内存:129G 操作系统:CentOS release 6.6 Sysbench:Sysbench 0.5 SSD硬盘:800G*6 raid10 /raid0 三、测试工具及内容 使用Sysbench对相同硬件、软件环境的raid、linux、mysql等相关参数进行io性能测试、mysql性能测试,对比io性能。 IO性能测试Sysbench参数: 参数名称 参数值 file-block

windows10环境下mysql8的安装与配置

一个人想着一个人 提交于 2020-08-18 04:30:15
1.下载mysql8 下载地址: https://dev.mysql.com/downloads/mysql/8.0.html 2.解压及配置 将下载的zip文件解压到想要安装的目录下 编辑my.ini文件如下: [mysql] # 设置mysql客户端默认字符集 default-character-set=utf8 [mysqld] #设置3306端口 port = 3306 # 设置mysql的安装目录 basedir=D://softwareByDevelop/mysql-8.0.19 # 设置mysql数据库的数据的存放目录 datadir=D://softwareByDevelop/mysql-8.0.19/data # 允许最大连接数 max_connections=200 # 允许连接失败的次数。这是为了防止有人从该主机试图攻击数据库系统 max_connect_errors=20 # 服务端使用的字符集默认为8比特编码的latin1字符集 character-set-server=utf8 # 创建新表时将使用的默认存储引擎 default-storage-engine=INNODB # 忽略密码 # skip-grant-tables 3.初始化及启动 管理员身份打开cmd,并进入 D:\softwareByDevelop\mysql-8.0.19\bin 目录