数据库性能

oracle Data guard

泄露秘密 提交于 2020-02-01 16:37:16
DATA GUARD的最主要的功能是冗灾。当然根据配置的不同,DATA GUARD还可以具备以下特点:高可用、性能提升、数据保护以及故障恢复等。 DATA GUARD可以分为物理STANDBY和逻辑STANDBY两种。二者的最大差别在于,物理STANDBY应用的是主库的归档日志,而逻辑STANDBY 应用的是主库的归档日志中提取的SQL语句。由于二者这一点的区别,决定了物理STANDBY无论从逻辑结构和物理结构都是和主库保持一致,而逻辑 STANDBY则只需保证逻辑结构一致,且逻辑STANDBY在应用SQL语句的时候, 数据库 可以处于打开的状态。 如果从DATA GUARD的保护模式分,可以分为三种不同的保护模式: 保护最大化:这种模式的配置可以保证主库和备库的同步,任何情况下主库的损毁都不会导致已提交数据的丢失。如果主库和备库之间的网络出现问题,或者备库本身出现问题,都会导致主库停止数据处理。 可用最大化:这种模式和上面一种类似,也是会保证主库和备库的同步,区别在于,当网络或备库不可用时,主库仍然可以继续处理。 性能最大化:主库和备库是异步的。这种模式可能在主库出现损毁时,丢失一部分数据。但是这种模式对主库负荷最小,因此具有最好的性能 ========================================================================

你在家快疯了?20 道数据库面试解析学起来

人走茶凉 提交于 2020-01-30 15:49:37
面试的时候,发现数据库方面,忘得一塌糊涂,抽时间整理了一些数据库方面的题。 事务四大特性(ACID)原子性、一致性、隔离性、持久性? 事务的并发?事务隔离级别,每个级别会引发什么问题,MySQL 默认是哪个级别? MySQL 常见的三种存储引擎(InnoDB、MyISAM、MEMORY)的区别? MySQL 的 MyISAM 与 InnoDB 两种存储引擎在,事务、锁级别,各自的适用场景? 查询语句不同元素(where、jion、limit、group by、having 等等)执行先后顺序? 什么是临时表,临时表什么时候删除? MySQL B+Tree 索引和 Hash 索引的区别? 聚集索引和非聚集索引区别? 有哪些锁(乐观锁悲观锁),select 时怎么加排它锁? 非关系型数据库和关系型数据库区别,优势比较? 数据库三范式,根据某个场景设计数据表? 数据库的读写分离、主从复制,主从复制分析的 7 个问题? 使用 explain 优化 sql 和索引? MySQL 慢查询怎么解决? 什么是 内连接、外连接、交叉连接、笛卡尔积等? mysql 都有什么锁,死锁判定原理和具体场景,死锁怎么解决? varchar 和 char 的使用场景? mysql 高并发环境解决方案? 数据库崩溃时事务的恢复机制(REDO 日志和 UNDO 日志)? 事务四大特性(ACID)原子性、一致性

C# 数据库并发的解决方案(通用版、EF版)

故事扮演 提交于 2020-01-27 04:21:38
十年河东,十年河西,莫欺少年穷。 EF就如同那个少年,ADO.NET则是一位壮年。毕竟ADO.NET出生在EF之前,而EF所走的路属于应用ADO.NET。 也就是说:你所写的LINQ查询,最后还是要转化为ADO.NET的SQL语句,转化过程中无形降低了EF的执行效率。 但是,使用EF的一个好处就是系统便于维护,减少了系统开发时间,降低了生成成本。 OK,上述只是做个简单的对比,那么在实际编码过程中,我们应当怎样提升EF的性能呢? 工欲善其事,必先利其器。 我们使用EF和在很大程度提高了开发速度,不过随之带来的是很多性能低下的写法和生成不太高效的sql。 虽然我们可以使用SQL Server Profiler来监控执行的sql,不过个人觉得实属麻烦,每次需要打开、过滤、清除、关闭。 在这里 强烈推荐一个插件MiniProfiler 。实时监控页面请求对应执行的sql语句、执行时间。简单、方便、针对性强。 如图: 关于MiniProfiler的使用,大家可参考: MiniProfiler工具介绍(监控加载用时,EF生成的SQL语句)--EF,迷你监控器,哈哈哈 1、EF使用SqlQuery 上述已经说的很明白了,EF效率低于ADO.NET是因为LINQ-TO-SQL的过程消耗了时间。而使用SqlQuery则可以直接写SQL语句。 当然,如果你想得到更快的执行速度

分布式锁 原理及实现方式

纵饮孤独 提交于 2020-01-27 00:03:47
一、原理 分布式锁是控制分布式系统之间同步访问共享资源的一种方式。如果不同的系统或是同一个系统的不同主机之间共享了一个或一组资源,那么访问这些资源的时候,往往需要通过一些互斥手段来防止彼此之间的干扰,以保证一致性,在这种情况下,就需要使用分布式锁了。 在平时的实际项目开发中,我们往往很少会去在意分布式锁,而是依赖于关系型数据库固有的排他性来实现不同进程之间的互斥,但大型分布式系统的性能瓶颈往往集中在数据库操作上。 在单机环境中,Java中其实提供了很多并发处理相关的API,但是这些API在分布式场景中就无能为力了。也就是说单纯的Java Api并不能提供分布式锁的能力。 其实秒杀类场景最主要的是执行秒杀操作要单线程的,提到单线程,肯定会想到synchronized关键字,但是他有两个致命缺点:1、无法做到细粒度控制,2、只适合单点不适用集群。 所以大多数项目只能采用分布式锁的实现方式。 针对分布式锁的实现,目前比较常用的有以下几种方案:     基于数据库实现分布式锁     基于缓存(redis,memcached,tair)实现分布式锁     基于Zookeeper实现分布式锁 分布式锁主要有基于缓存如redis、基于zookeeper、基于数据库的实现。 在分析这几种实现方案之前我们先来想一下,我们需要的分布式锁应该是怎么样的?(这里以方法锁为例,资源锁同理)     

SQL 优化原则

流过昼夜 提交于 2020-01-26 01:55:44
   一、问题的提出  在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图的的编写等体会不出SQL语句各种写法的性能优劣,但是如果将应用 系统提交实际应用后,随着数据库中数据的增加,系统的响应速度就成为目前系统需要解决的最主要的问题之一。系统优化中一个很重要的方面就是SQL语句的优 化。对于海量数据,劣质SQL语句和优质SQL语句之间的速度差别可以达到上百倍,可见对于一个系统不是简单地能实现其功能就可,而是要写出高质量的 SQL语句,提高系统的可用性。   在多数情况下,Oracle使用索引来更快地遍历表,优化器主要根据定义的索引来提高性能。但是,如果在SQL语句的where子句中写的 SQL代码不合理,就会造成优化器删去索引而使用全表扫描,一般就这种SQL语句就是所谓的劣质SQL语句。在编写SQL语句时我们应清楚优化器根据何种 原则来删除索引,这有助于写出高性能的SQL语句。   二、SQL语句编写注意问题   下面就某些SQL语句的where子句编写中需要注意的问题作详细介绍。在这些where子句中,即使某些列存在索引,但是由于编写了劣质的SQL,系统在运行该SQL语句时也不能使用该索引,而同样使用全表扫描,这就造成了响应速度的极大降低。    1. IS NULL 与 IS NOT NULL    不能用null作索引

mysql性能优化

旧街凉风 提交于 2020-01-24 13:46:15
数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的事情 1.为查询缓存优化你的查询 mysql> show variables like '%query_cache%'; (query_cache_type 为 ON 表示已经开启) +------------------------------+----------+ | Variable_name | Value | +------------------------------+----------+ | have_query_cache | YES | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 20971520 | | query_cache_type | ON | | query_cache_wlock_invalidate | OFF | +------------------------------+----------+ 如果不是ON,修改配置文件以开启查询缓存: > vi /etc/my.cnf [mysqld]中添加: query_cache_size = 20M #缓存的大小

MySQL性能管理及架构设计:第2章 什么影响了MySQL性能

不想你离开。 提交于 2020-01-23 15:44:56
第2章 什么影响了MySQL性能 2-1 影响性能的几个方面 1、服务器的硬件 2、服务器的操作系统 3、数据库的存储引擎 4、数据库的参数配置 5、数据库表结构设计和SQL语句的编写和优化 2-2 CPU资源和可用内存大小 2-03 磁盘的配置和选择 2-04 使用RAID增加传统机器硬盘的性能 2-05 使用固态存储SSD或PCIe卡 2-06 使用网络存储SAN和NAS 2-07 总结:服务器硬件对性能的影响 2-08 操作系统对性能的影响-MySQL适合的操作系统 Windows、FreeBSD、Solaris Linux、CentOS 2-09 CentOS系统参数优化 来源: https://www.cnblogs.com/MarlonKang/p/12230632.html

java性能调优

余生颓废 提交于 2020-01-22 06:09:49
java性能调优 一、代码优化 1、使用递归调用时,如果过多的调用容易造成java.lang.StackOverflowError即栈溢出和程序执行过慢。这是一个潜在Bug和影响程序执行效率问题,需要谨慎使用。原因:每次递归调用时会向栈中push当前方法的运行状态(现场),而Java栈内存的使用超过限制的大小时,程序会出现栈异常。 2、及时关闭流。Java编程过程中,进行数据库连接、I/O 流操作时务必小心,在使用完毕后,及时关闭以释放资源。因为对这些大对象的操作会造成系统大的开销,稍有不慎,将会导致严重的后果。 3、注意方法、类文件中的代码量,适度分离。 4、使用基本类型定义变量时,千万注意该变量值可能为null的情况,此时建议使用对应的包装类来定义变量。 5、循环体内不要使用 “+” 进行字符串拼接,而直接使用 StringBuilder 不断 append。通过查看反编译以后的代码,可以发现,在字符串常量在拼接过程中,是将 String 转成了 StringBuilder 后,使用其 append() 方法进行处理的。 6、循环内不要不断创建对象引用。 7、尽量采用懒加载的策略,即在需要的时候才开始创建变量和对象等。 8、将一些需要变动的配置或文案写在属性文件中。 9、后端接口需要提供必要的校验,不要过于依赖前端校验。 10、基于效率和类型检查的考虑,应该尽可能使用 数组

MySQL SQL优化

匆匆过客 提交于 2020-01-20 15:47:38
SQL优化大全 索引优化 1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num is null可以在num上设置默认值0,确保表中num列没有null值,然后这样查询:select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。 4.应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:select id from t where num=10 or num=20可以这样查询:select id from t where num=10 union all select id from t where num=20 http://5.in 和 not in 也要慎用,否则会导致全表扫描,如:select id from t where num in(1,2,3) 对于连续的数值,能用 between 就不要用 in 了:select id from t where num between 1 and 3 6

数据库表索引碎片和sql性能分析

寵の児 提交于 2020-01-20 04:27:52
查询碎片 SELECT table_name , ROUND ( ( blocks * 8 ), 2 ) "高水位空间 k" , ROUND ( ( num_rows * avg_row_len / 1024 ), 2 ) "真实使用空间 k" , ROUND ( ( blocks * 10 / 100 ) * 8 , 2 ) "预留空间(pctfree) k" , ROUND ( ( blocks * 8 - ( num_rows * avg_row_len / 1024 ) - blocks * 8 * 10 / 100 ), 2 ) "浪费空间 k" FROM user_tables WHERE temporary = 'N' and table_name in ( 'MAIN_TABLE1', 'MAIN_TABLE2', 'MAIN_TABLE3' ... ) ORDER BY 5 DESC ; 说明:如果有碎片浪费空间最好都清理一下。 建议清理碎片程度计算范围 1-(真实使用空间/高水位空间)>8% 2、主表开启行迁移 begin for idx in ( SELECT 'alter table ' || table_name || ' enable row movement;' row_cur FROM user_tables WHERE table_name in