sql优化

阿里云PolarDB及其共享存储PolarFS技术实现分析(上)

て烟熏妆下的殇ゞ 提交于 2020-03-21 06:37:21
PolarDB是阿里云基于MySQL推出的云原生数据库(Cloud Native Database)产品,通过将数据库中计算和存储分离,多个计算节点访问同一份存储数据的方式来解决目前MySQL数据库存在的运维和扩展性问题;通过引入RDMA和SPDK等新硬件来改造传统的网络和IO协议栈来极大提升数据库性能。代表了未来数据库发展的一个方向。本系列共2篇文章,主要分析为什么会出现PolarDB以及其技术实现。 由于PolarDB并不开源,因此只能基于阿里云公开的技术资料进行解读。这些资料包括从去年下半年开始陆续在阿里云栖社区、云栖大会等场合发布的PolarDB相关资料,以及今年以来公开的PolarDB后端共享存储PolarFS相关文章。 PolarDB出现背景 MySQL云服务遇到的问题 首先来了解下为什么会出现PolarDB。阿里云数据库团队具备国内领先的技术能力,为MySQL等数据库在国内的推广起到了很大的作用。在阿里云上也维护了非常庞大的MySQL云服务(RDS)集群,但也遇到了很多棘手的问题。举例如下: 实例数据量太大,单实例几个TB的数据,这样即使使用xtrabackup物理备份,也需要很长的备份时间,且备份期间写入量大的话可能导致redo日志被覆盖引起备份失败; 大实例故障恢复需要重建时,耗时太长,影响服务可用性(此时存活节点也挂了,那么完蛋了)。时间长有2个原因

explain的使用

拟墨画扇 提交于 2020-03-21 01:28:48
在对某个Query优化过程中,须要不断地使用explain来验证各种调整是否有效。 MySQL explain功能展示的各种信息的解释如下: id: MySQL Query Optimizer 选定的执行计划中查询的序列号。 select_type: 所使用的查询类型,主要有以下这几种查询类型。 DEPENDENT SUBQUERY:子查询内层的第一个select,依赖于外部查询的结果集。 DEPENDENT UNION:子查询中的union,且为union中从第二个select开始的后面所有的select,同样依赖于外部查询的结果集。 PRIMARY:子查询中的最外层查询,注意并不是主键查询。 SIMPLE:除子查询或者union之外的其他查询。 SUBQUERY:子查询内层查询的第一个select,结果不依赖于外部查询的结果集。 UNCACHETABLE SUBQUERY:结果集无法缓存的子查询。 UNION:union语句中第二个select开始后面的所有select,第一个select为primary。 UNION RESULT:union中的合并结果。 table:显示这一步所访问的数据库中的表的名称。 type:告诉我们队表使用的访问方式,主要包含如下几种类型。 all:全表扫描。 const:读常量,最多只会有一条记录匹配,由于是常量,实际上只须要读一次。 eq

JDBC学习笔记(4)——PreparedStatement的使用

亡梦爱人 提交于 2020-03-20 22:02:00
PreparedStatement public interface PreparedStatement extends Statement;可以看到PreparedStatement是Statement的子接口,我们在执行查询或者更新数据表数据的时候,拼写SQL语句是一个很费力并且容易出错的事情,PreparedStatement可以简化这样的一个过程. PreParedStatement 1).why?我们为什么要使用它 使用Statement需要进行拼写SQl语句,辛苦并且容易出错,之前使用Statement的SQL语句的形式是这样的 String sql = "insert into examstudent" + " values(" + student.getFlowId() + "," + student.getType() + ",'" + student.getIdCard() + "','" + student.getExamCard() + "','" + student.getStudentName() + "','" + student.getLocation() + "'," + student.getGrade() + ")"; 使用PreparedStatement:是Statement的子接口,可以传入 带占位符 的SQL语句

JDBC中的Statement和PreparedStatement的区别

倾然丶 夕夏残阳落幕 提交于 2020-03-20 21:14:59
PreparedStatement是什么? PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快; public class PreparedStmtExample { public static void main ( String args [ ] ) throws SQLException { Connection conn = DriverManager . getConnection ( "mysql:\\localhost:1520" , "root" , "root" ) ; PreparedStatement preStatement = conn . prepareStatement ( "select distinct loan_type from loan where bank=?" ) ; preStatement . setString ( 1 , "Citibank" ) ; ResultSet

PreparedStatement 与 Statement

痴心易碎 提交于 2020-03-20 21:14:45
PreparedStatement是用来执行SQL查询语句的API之一,Java提供了 Statement、PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程。同时PreparedStatement还经常会在Java面试被提及,譬如:Statement与PreparedStatement的区别以及如何避免SQL注入式攻击?这篇教程中我们会讨论为什么要用PreparedStatement?使用PreparedStatement有什么样的优势?PreparedStatement又是如何避免SQL注入攻击的? PreparedStatement是什么? PreparedStatement是java.sql包下面的一个接口,用来执行SQL语句查询,通过调用connection.preparedStatement(sql)方法可以获得PreparedStatment对象。数据库系统会对sql语句进行预编译处理(如果JDBC驱动支持的话),预处理语句将被预先编译好,这条预编译的sql查询语句能在将来的查询中重用,这样一来,它比Statement对象生成的查询速度更快。下面是一个例子: 1 2 3

理解MySQL——架构与概念

末鹿安然 提交于 2020-03-20 18:28:59
写在前面:最早接触的MySQL是在三年前,那时候MySQL还是4.x版本,很多功能都不支持,比如,存储过程,视图,触发器,更别说分布式事务等复杂特性了。但从5.0(2005年10月)开始,MySQL渐渐步入企业级数据库的行列了;复制、集群、分区、分布式事务,这些企业级的特性,使得现在的MySQL,完全可以应用于企业级应用环境(很多互联网公司都用其作为数据库服务器,尽管节约成本是一个因素,但是没有强大功能作后盾,则是不可想象的)。虽然,MySQL还有很多不足,比如,复制、分区的支持都十分有限、查询优化仍需要改进,但是MySQL已经是一个足够好的DBMS了,更何况它是opensource的。这段时间没有事,出于好奇,略微的研究了一下MySQL,积累了一些资料,欲总结出来。这些资料打算分为两部分,上部主要讨论MySQL的优化,其中主要参考了《MySQL Manual》和《High Performance MySQL》,如果有时间,以后在下部分析一下MySQL的源码。如果你是MySQL高手,希望你不吝赐教;如果你是新手,希望对你有用。 第一章、MySQL架构与概念 1、MySQL的逻辑架构 最上面不是MySQL特有的,所有基于网络的C/S的网络应用程序都应该包括连接处理、认证、安全管理等。 中间层是MySQL的核心,包括查询解析、分析、优化和缓存等。同时它还提供跨存储引擎的功能

Python数据库操作 Mysql数据库表引擎与字符集#学习猿地

被刻印的时光 ゝ 提交于 2020-03-20 12:22:47
# Mysql数据库表引擎与字符集 ![](./imgs/752951346A5F4E7EBDE362FA97107707.png) ### 1.服务器处理客户端请求 其实不论客户端进程和服务器进程是采用哪种方式进行通信,最后实现的效果都是:**客户端进程向服务器进程发送一段文本(MySQL语句),服务器进程处理后再向客户端进程发送一段文本(处理结果)。**那服务器进程对客户端进程发送的请求做了什么处理,才能产生最后的处理结果呢?客户端可以向服务器发送增删改查各类请求,我们这里以比较复杂的查询请求为例来画个图展示一下大致的过程: ![image](./imgs/167f4c7b99f87e1c.png) > 虽然查询缓存有时可以提升系统性能,但也不得不因维护这块缓存而造成一些开销,比如每次都要去查询缓存中检索,查询请求处理完需要更新查询缓存,维护该查询缓存对应的内存区域。从MySQL 5.7.20开始,不推荐使用查询缓存,并在MySQL 8.0中删除。 ### 2.存储引擎 `MySQL`服务器把数据的存储和提取操作都封装到了一个叫`存储引擎`的模块里。我们知道`表`是由一行一行的记录组成的,但这只是一个逻辑上的概念,物理上如何表示记录,怎么从表中读取数据,怎么把数据写入具体的物理存储器上,这都是`存储引擎`负责的事情。为了实现不同的功能,`MySQL`提供了各式各样的`存储引擎`

MySQL为什么要给表加上主键

こ雲淡風輕ζ 提交于 2020-03-20 10:42:19
1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,并且是「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错,再说一遍,整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键,一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。   import matplotlib.pyplot as plt      plt.rcParams[www.yongyunzhuce.cn'font.sans-serif']=['SimHei']      x_data = [2011,2012,2013,2014,2015,2016,2017]      y_data = [www.zhuyngyule.cn 58000,60200,63000,71000,84000,90500,107000]      plt.xticks(x_data, ['2011年','2012年','2013年','2014年','2015年','2016年','2017年'])      plt.yticks(y_data)      plt.plot(x_data,www

MySQL为什么要给表加上主键

橙三吉。 提交于 2020-03-20 10:15:39
3 月,跳不动了?>>> 1.一个没加主键的表,它的数据无序的放置在磁盘存储器上,一行一行的排列的很整齐. 2.一个加了主键的表,并不能被称之为「表」。如果给表上了主键,那么表在磁盘上的存储结构就由整齐排列的结构转变成了树状结构,并且是「平衡树」结构,换句话说,就是整个表就变成了一个索引。没错,再说一遍,整个表变成了一个索引,也就是所谓的「聚集索引」。 这就是为什么一个表只能有一个主键,一个表只能有一个「聚集索引」,因为主键的作用就是把「表」的数据格式转换成「索引(平衡树)」的格式放置。 3.给表中多个字段加上常规的索引,那么就会出现多个独立的索引结构.字段中的数据就会被复制一份出来,用于生成索引,叶子节点是主键ID,这也就是非聚集索引.,下面就是一个主键和三个常规索引的结构 4.通过主键去查,叶子节点就是数据行 5.通过其他索引字段去查,那么叶子节点是主键ID,然后再去根据主键查,聚集索引(主键)是通往真实数据所在的唯一路径 7.有一种例外可以不使用聚集索引就能查询出所需要的数据,这种非主流的方法称之为「覆盖索引」查询,也就是平时所说的复合索引或者多字段索引查询 以上内容希望帮助到大家, 很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优

黑马程序员----SQL 语句学习

百般思念 提交于 2020-03-20 07:43:07
---------------------- Windows Phone 7手机开发 、 .Net培训 、期待与您交流! ---------------------- 数据库概念 1.1 catalog(分类),不同类的数据应该放到不同的数据库中 a、偏于对各个Catalog进行个性化管理 b、避免命名冲突 c、安全性更高 1.2 Table(表) 不同类型的资料放到不同的格子中,将这种区域叫做表。不同的表根据方的数据不同进行空间的优化,找起来也方便。 a、主键(PrimaryKey) : 就是数据行的唯一标识。不会重复的列才能当主键。一个表可以没有主键,但是会非常难以处理,因此没有特殊里有表都要设定主键。 主键有两种选用策略: 业务主键和逻辑主键 。业务主键是使用有业务意义的字段做主键,比如身份证号、银行账号等;逻辑主键是使用没有任何业务意义的字段做主键,完全给程序看的,业务人员不会看的数据。因为很难保证业务主键不会重复,不会变化,因此推荐用逻辑主键。 b、表间关联、外键:当表中出现字段重复时,可以把原先比较重复的表,化简为两个表来表示。一个表中的主键是另外一个表的外键。外键就是关联两个表的键. 1.3在数据库中的数据类型与在C#中的区别 bit相当于C#中的bool类型, char(10)10个字符 int 32位 bigint 64位 nvarchar(max)无限长的字符串