1回顾上一节我们详细讲解了如何对数据库进行分区操作,包括了垂直拆分(ScaleUp纵向扩展)和水平拆分(ScaleOut横向扩展),同时简要整理了水平分区的几种策略,现在来回顾一下。2水平分区的5种策略2.1Hash(哈希)这种策略是通过对表的一个或多个列的HashKey进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区。例如我们可以建立一个对表的日期的年份进行分区的策略,这样每个年份都会被聚集在一个区间。1PARTITIONBYHASH(YEAR(createtime))2PARTITIONS102.2Range(范围)这种策略是将数据划分不同范围。例如我们可以将一个千万级别的表
合辑地址:MySQL全面瓦解1为什么需要数据库备份灾难恢复:当发生数据灾难的时候,需要对损坏的数据进行恢复和还原需求的变更或者回滚:当需求发生变更,或者需要回滚到之前的版本时,数据库备份也显得很重要。审计:需要知道某一个阶段的数据或者Schema的实际情况测试:将实际的生产环境的数据导入到本地备份为测试数据,来验证新功能,可以省去很多麻烦。2备份需要考虑的几个关键点恢复点目标(PRO):可以容忍丢失多少数据恢复时间目标(RTO):需要等待多久将数据恢复恢复的时候是需要持续提供服务还是停机恢复。需要恢复的内容:整个服务器,多库多表,单库单表,或是特定的事务或语句。3备份方案3.1离线备份和在线备
1为什么要分库分表物理服务机的CPU、内存、存储设备、连接数等资源有限,某个时段大量连接同时执行操作,会导致数据库在处理上遇到性能瓶颈。为了解决这个问题,行业先驱门充分发扬了分而治之的思想,对大库表进行分割,然后实施更好的控制和管理,同时使用多台机器的CPU、内存、存储,提供更好的性能。而分治有两种实现方式:垂直拆分和水平拆分。2垂直拆分(ScaleUp纵向扩展)垂直拆分分为垂直分库和垂直分表,主要按功能模块拆分,以解决各个库或者各个表之间的资源竞争。比如分为订单库、商品库、用户库...这种方式,多个数据库之间的表结构是不同的。2.1垂直分库先说说垂直分库。垂直分库其实是一种简单逻辑分割。比如
概念主从复制,是指建立一个和主数据库完全一样的数据库环境(称为从数据库),并将主库的操作行为进行复制的过程:将主数据库的DDL和DML的操作日志同步到从数据库上,然后在从数据库上对这些日志进行重新执行,来保证从数据库和主数据库的数据的一致性。为什么要做主从复制1、在复杂的业务操作中,经常会有操作导致锁行甚至锁表的情况,如果读写不解耦,会很影响运行中的业务,使用主从复制,让主库负责写,从库负责读。即使主库出现了锁表的情景,通过读从库也可以保证业务的正常运行。2、保证数据的热备份,主库宕机后能够及时替换主库,保障业务可用性。3、架构的演进:业务量扩大,I/O访问频率增高,单机无法满足,主从复制可以
数据库对象命名规范数据库对象数据库对象是数据库的组成部分,常见的有以下几种:表(Table)、索引(Index)、视图(View)、图表(Diagram)、缺省值(Default)、规则(Rule)、触发器(Trigger)、存储过程(StoredProcedure)、用户(User)等。命名规范是指数据库对象如数据库(SCHEMA)、表(TABLE)、索引(INDEX)、约束(CONSTRAINTS)等的命名约定。数据库对象全局命名规范1、命名使用具有意义的英文词汇,词汇中间以下划线分隔2、命名只能使用英文字母、数字、下划线,以英文字母开头3、避免用MySQL的保留字如:backup、cal
学习如果构建高性能的索引之前,我们先来了解下之前的知识,以下两篇是基础原理,了解之后,对面后续索引构建的原则和优化方法会有更清晰的理解:MySQL全面瓦解22:索引的介绍和原理分析MySQL全面瓦解23:MySQL索引实现和使用我们编写索引的目的是什么?就是使我们的sql语句执行得更加高效,更快的获取或者处理数据,这个也是建设高性能Web的必要条件。只有我们深刻理解了索引的原理和执行过程,才能知道怎么恰当地使用索引,以及怎么达到最优的查询。知识回顾innodb是MySQL默认的存储引擎,使用范围也较广,我们就以innodb存储引擎为例来进行下面方案的说明。b+树存储结构MySQL采用b+树的方
回顾一下上面几篇索引相关的文章:MySQL全面瓦解22:索引的介绍和原理分析MySQL全面瓦解23:MySQL索引实现和使用MySQL全面瓦解24:构建高性能索引(策略篇)索引的十大原则1、正确理解和计算索引字段的区分度,文中有计算规则,区分度高的索引,可以快速得定位数据,区分度太低,无法有效的利用索引,可能需要扫描大量数据页,和不使用索引没什么差别。2、正确理解和计算前缀索引的字段长度,文中有判断规则,合适的长度要保证高的区分度和最恰当的索引存储容量,只有达到最佳状态,才是保证高效率的索引。3、联合索引注意最左匹配原则:必须按照从左到右的顺序匹配,MySQL会一直向右匹配索引直到遇到范围查询
MySQL索引实现上一篇我们详细了解了B+树的实现原理(传送门)。我们知道,MySQL内部索引是由不同的引擎实现的,主要包含InnoDB和MyISAM这两种,并且这两种引擎中的索引都是使用b+树的结构来存储的。InnoDB引擎中的索引Innodb中有2种索引:主键索引(也叫聚集索引)、辅助索引(也叫非聚集索引)。主键索引:每个表只有一个主键索引,b+树结构,叶子节点存储主键的值以及对应整条记录的数据,非叶子节点不存储记录的数据,只存储主键的值。当表中未指定主键时,MySQL内部会自动给每条记录添加一个隐藏的rowid字段(默认4个字节)作为主键,用rowid构建聚集索引。聚集索引在MySQL中
索引的定义MySQL官方对索引的定义为:索引(Index)是协助MySQL高效获取数据的数据结构。本质上,索引的目的是为了提高查询效率,通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。可以类比银行的保险柜,比如你要找归属你的保险柜子。如果没有索引,你需要拿着钥匙,一个个的保险柜的试过去才能找到属于你的保险柜。但是如果有了索引,而且保险柜能够以物理分区的方式存在在对应的区域,同时你可以根据钥匙上的编号(A1003-10-17),找到保险柜所在A1003的存放房间,找到存放室保险柜的第10排
背景1月22号晚上10点半,下班后愉快的坐在在回家的地铁上,心里想着周末的生活怎么安排。突然电话响了起来,一看是我们的一个开发同学,顿时紧张了起来,本周的版本已经发布过了,这时候打电话一般来说是线上出问题了。果然,沟通的情况是线上的一个查询数据的接口被疯狂的失去理智般的调用,这个操作直接导致线上的MySql集群被拖慢了。好吧,这问题算是严重了,下了地铁匆匆赶到家,开电脑,跟同事把Pinpoint上的慢查询日志捞出来。看到一个很奇怪的查询,如下1POSTdomain/v1.0/module/method?order=condition&orderType=desc&offset=
背景说到流程控制语句,我们在程序语法中用的比较多,比如C#的if..else...,while...,?:等。同样的,在MySQL中,也有一些流程控制的语法,方便我们在写函数、存储过程的时候对逻辑进行控制和处理。常见的过程式SQL语句可以用在存储过程或者函数体中。其中包括:IF函数、IF条件语句、CASE语句、LOOP语句、WHILE语句、REPEAT语句、LEAVE语句和ITERATE语句,它们极大的方便了我们进行流程控制。下面我们一个一个来看。流程语句分解数据基础1mysql>select*fromstudents;2+-----------+-------------+------
关于触发器现实开发中我们经常会遇到这种情况,比如添加、删除和修改信息的时候需要记录日志,我们就要在完成常规的数据库逻辑操作之后再去写入日志表,这样变成了两步操作,更复杂了。又比如删除一个人员信息的时候,需要将他的购物记录、收货地址、收藏夹等都删了,这个连续的操作容易出错,一致性和完整性不好保证。这时候就要使用触发器,既可以免去一堆的业务逻辑代码,又能更好的保证数据完整性。触发器(trigger)是一种与表有关的数据库对象:在满足定义条件时触发某种操作,并执行触发器中定义的语句集合。触发器的这种特性可以协助应用在数据库端保证数据的完整性。它是一种与表事件相关的特殊的存储过程,当对一个表进行操作(
定义我们之前学习了MySQL的内置函数,传送门,非常丰富,满足了我们对数据操作的大部分需求。但是如果有一些复杂的业务逻辑在数据库层面就可以完成,无需在程序层面完成的时候,这时候就可以写成MySQL自定义函数。所以,函数是指一组预编译好的sql语句集合,理解成批处理语句,类似于C#中的方法,但是必须有返回值。调用函数等于一次性执行了这些语句,有利降低语句重复编写和调用。作用1、可以高度抽象业务逻辑,前置到数据库层面,而不是应用层面2、相比于从数据库查询出来,然后程序操作数据,数据库操作一定程度上提高效率。3、高度可复用性,数据库层面的方法封装,不只是应用在多个同样业务场景。还可以应用到多个不同语
定义我们经常会遇到这样的一种情况,需要对我们查询的结果进行遍历操作,并对遍历到的每一条数据进行处理,这时候就会使用到游标。所以:游标(Cursor)是处理数据的一种存储在MySQL服务器上的数据库查询方法,为了查看或者处理结果集中的数据,提供了在结果集中一次一行遍历数据的能力。游标主要用在循环处理、存储过程、函数、触发器中。游标的作用比如我们上面那个students学生,需要对每个用户进行遍历,然后根据他们的其他评价进行加分或者减分。这时候我们就需要查询到所有的学生信息(包含成绩)。1selectstudentid,studentname,scorefromstudents; 执行之后返回了的
概述很多时候,我们会有一些很复杂的数据库操作,比如整合用户的行为数据,那这些数据可能包含用户的餐饮、生活日用、充值消费、交通出行、通讯物流、交通出行、医疗保健、住房物业、运动健康...基于此,我们可能要去关联很多的用户行为信息表,写一大堆的合并、统计,以及条件过滤的脚本,来输出最终的二维表,这才是用户真正需要的数据。如果把这些复杂的脚本写在业务程序中不是很合理,那有什么办法把这些脚本细节隐藏,只显示只显示简洁的结果呢,那就要用到视图了。视图是由数据库中的一个表或多个表导出的虚拟表,是一种虚拟存在的表,方便用户对数据的操作。概念视图是在mysql5之后出现的,是一种虚拟表,行和列的数据来自于定义
概述大多数SQL语句都是针对一个或多个表的单条语句。但并非所有业务都这么简单,经常会有复杂的操作需要多条语句才能完成。比如用户购买一个商品,要删减库存表,要生成订单数据,要保存支付信息等等,他是一个批量的语句执行行为。存储过程简单来说,就是为以后的使用而保存的一条或多条MySQL语句的集合。可将其视为批文件,虽然它们的作用不仅限于批处理。优点:提高代码的复用性:把一些通用操作内容封装到一个存储过程中,可以不断的给业务功能复用。简化操作:避免在业务中写大量的代码提高效率:减少执行次数和数据库服务器连接次数。提高安全性:通过存储过可以减少对基础数据的误操作,参数化的存储过程一定程度上可以防止SQL
概述提到MySQL的系统函数,我们前面有使用过聚合函数,其实只是其中一小部分。MySQL提供很多功能强大、方便易用的函数,使用这些函数,可以极大地提高用户对于数据库的管理效率,并更加灵活地满足不同用户的需求。本文将MySQL的函数分类并汇总,以便提供后面使用中的参考。MySQL数值类型函数数值类型函数说明abs返回绝对值sqrt返回二次方根mod返回余数ceil/ceiling两个函数功能一致,返回不小于参数的最小整数,即向上取整floor向下取整,返回值转化为bigintrand生成一个0~1之间的随机数,传入整数参数是,用来产生重复序列round对所传参数进行四舍五入sign返回参数的符号
关于事务我们在数据库中需要执行一个系列的操作的时候,要保证这个系列执行的连续性和完整性,要么整个系列的执行都成功,要么就全部失败(只要有一个步骤失败,其他均回滚到之前的状态),保证不会存在一部分成功一部分失败的情况。这就是我们事务的职责。下面举个分苹果的例子:A同学有3个苹果,B同学有2个苹果,如果A同学给一个苹果给B同学,那么A同学只剩下2个苹果,而B同学有了3个。步骤如下1updatetnamesetapples=apples-1wherename="A";2updatetnamesetapples=apples+1wherename="B"; 当然
概述MySQL最强大的功能之一就是能在数据检索的执行中连接(join)表。大部分的单表数据查询并不能满足我们的需求,这时候我们就需要连接一个或者多个表,并通过一些条件过滤筛选出我们需要的数据。了解MySQL连接查询之前我们先来理解下笛卡尔积的原理。数据准备依旧使用上节的表数据(包含classes班级表和students学生表):1mysql>select*fromclasses;2+---------+-----------+3|classid|classname|4+---------+-----------+5|1|初三一班|6|2|初三二班|7|3|初三三班|8|4|初三四班|9+
概述相信我们经常会遇到这样的场景:想要了解双十一天猫购买化妆品的人员中平均消费额度是多少(这可能有利于对商品价格区间的定位);或者不同年龄段的化妆品消费占比是多少(这可能有助于对商品备货量的预估)。这个时候就要用到分组查询,分组查询的目的是为了把数据分成多个逻辑组(购买化妆品的人员是一个组,不同年龄段购买化妆品的人员也是组),并对每个组进行聚合计算的过程:。分组查询的语法格式如下:1selectcname,group_fun,...fromtname[wherecondition]2groupbygroup_expression[havinggroup_condition]; 说明一下:1、g
概述子查询是SQL查询中的重要一块,是我们基于多表之间进行数据聚合和判断的一种手段,使得我们的处理复杂数据更加的便捷,这一节我们主要来了解一下子查询。先做一下数据准备,这边建立三张表:班级、学生、毕业成绩表,用于后面的操作:1dropdatabaseifexists`Helenlyn_Class`;2createdatabase`Helenlyn_Class`;34/*班级表*/5DROPTABLEIFEXISTS`classes`;6CREATETABLE`classes`(7`classid`intprimarykeyAUTO_INCREMENTcomment'班级id',8`classn
概述上一章查询的过滤条件,我们了解了MySQL可以通过like%通配符来进行模糊匹配。同样的,它也支持其他正则表达式的匹配,我们在MySQL中使用REGEXP操作符来进行正则表达式匹配。用法和like相似,但又强大很多,能够实现一些很特殊的、复杂的规则匹配。正则表达式使用REGEXP命令进行匹配时,如果符合返回1,不符合返回0。如果默认不加任何匹配规则REGEXP相当于like'%%'。在前面加上NOT(NOTREGEXP)相当于NOTLIKE。匹配模式分析下面有个表格,罗列了可应用于REGEXP操作符中正则匹配模式,描述相对比较详细了,后面我们一个一个来测试。 匹配模式 描述 匹配模式
概述数据库中的数据直接呈现出来一般不是我们想要的,所以我们上两节演示了如何对数据进行过滤的方法。除了对数据进行过滤,我们可能还需要对数据进行排序,比如想从列表中了解消费最高的项,就可能需要对金额字段做降序排序,想看年龄从小到大的分布情况,就可能需要对user表的age字段进行升序排序。也可能需要对数据进行限制,比如我们需要对付款的1~10,11~20,21~30名的用户分别赠予不同的礼品,这时候对数据的限制就很有用了。备注:下面脚本中[]包含的表示可选,|分隔符表示可选其一。数据排序orderby语法格式如下:1、需要排序的字段跟在orderby之后;2、asc和desc表示排序的规则,asc
概述提到查询,就回到我们第四篇的SQL语言分类了,DQL(DataQueryLanguage),也就是数据查询语言,实际就是从数据库中获取数据的一种命令方式。我们给数据库发送一个查询语句的命令,数据库按需返回相应的数据。查询基本语法selectcolumn_name1,column_name2,...fromtname;SQL中不区分大小写,select语句中不区分大小写,SELECT和select、FROM和from效果一样。查询的结果放在一个表格中,表格的第1行称为列头,第2行开始是数据,类属于一个二维数组。查询单个字段配置字段名称,格式如下:1selectcolumn_name1from
概述在实际的业务场景应用中,我们经常要根据业务条件获取并筛选出我们的目标数据。这个过程我们称之为数据查询的过滤。而过滤过程使用的各种条件(比如日期时间、用户、状态)是我们获取精准数据的必要步骤,这样才能得到我们期望的结果。所以本章我们来学习MySQL中查询过滤条件的各种用法。关系运算关系运算就是where语句后跟上一个或者n个条件,满足where后面条件的数据会被返回,反之不满足的就会被过滤掉。operators指的是运算符,有如下几种情况: 运算符 说明 运算符 说明 =等于<>或者!=不等于>大于>=大于等于<小于<=小于等于关系运算基本的语法格式
前言SQL的语言分类主要包含如下几种:DDL数据定义语言create、drop、alter数据定义语言create、drop、alter语句。DDL数据定义语言create、drop、alter数据定义语言create、drop、alter语句。DML数据操纵语言insert、delete、update定义对数据库记录的增、删、改操作。DQL数据库查询语言select定义对数据库记录的查询操作。DCL数据库控制语言grant、remove定义对数据库、表、字段、用户的访问权限和安全级别。(授权grant,收回权限revoke等)。TCL事务控制语言setautocommit=0、starttr
说明DML(DataManipulationLanguage)数据操作语言,是指对数据库进行增删改的操作指令,主要有INSERT、UPDATE、DELETE三种,代表插入、更新与删除,这是学习MySQL必要掌握的基本知识。与之前的章节一致,下方语法中[]中内容可以省略。INSERT操作逐行插入语法格式如下:1insertintot_name[(column_name1,columnname_2,...)]values(val1,val2);2或者3insertintot_namesetcolumn_name1=val1,column_name2=val2;1、字段名称和值需要保证数量一直,类型
常用命令打开CMD命令窗口(记住使用管理员身份运行),我们就可以在命令窗口中做一些MySQL的命令操作了:服务启动和关闭这个我们上一个章节使用过了:netstartmysql,这是服务命令,不是语句命令,后面不需要加引号1netstopmysql--代表停止MySQL服务2netstartmysq--代表启动MySQL服务MySQL登录命令这个我们前面一章我们也了解过,使用过了:mysql-h主机名-P端口-u用户名-p,前面一章有对-h,-u,-p作过解释,这边-P是指Port端口。1mysql-hlocalhost-P3306-uroot-p默认情况下登陆本机,其实端口和主机都可以省略的:
概述MySQL支持很多数据类型,以便我们能在复杂的业务场景中支持各种各样的数据格式,存储适当的数据内容。我们在设计数据库时,正确的使用数据库类型对整个数据库的整洁和高效,会有很大的帮助。目前常用的数据类型大致上可以分为4大类:整数类型、浮点数类型、字符串(字符)类型、日期/时间类型。详细如下 4大类 主要类型 4大类 主要类型 整数类型tinyint、smallint、mediumint、int、bigint浮点数类型float、double、decimal字符串(字符)类型char、varchar、tinyblob、blob、mediumblob、longblob、tinytext、t
下载与安装互联网高速时代下,我们的生活发生了巨大的变化,从购物(淘宝、京东),出行(滴滴、快狗),支付(支付宝、微信)等,遍及我们生活的方方面面,我们使用这些系统和应用的时候,会在上面获取、存储大量的数据信息,那这些信息总是要进行落地并持久化存储,才能在各种各样的业务场景中使用。所以我们把数据存储在了数据库中,常用的数据库有mysql、oracle、sqlserver、db2等。MySQL是关系数据库中的一种,使用标准化SQL语言访问数据库,它具有体积小、速度快、总体成本低的特点,而且是开源的,在应用方面MySQL是最好的RDBMS(关系数据库管理系统)应用软件之一。而在国内环境中,MySQL