当对数据库进行海量级的数据插入时,数据库出现报错,错误原因可能有哪些

当对数据库进行海量级的数据插入时,数据库出现报错,错误原因可能有哪些,第1张

1:数据表空间不足,因为Oracle必须指定表空间的大小 更改表空间大小,如果装有双机热备则必须对物理存贮文件进行手工更改

2:表死锁 采用脚本形式对表解锁

3:监听丢失,重启监听解决

数据库优化一方面是找出系统的瓶颈,提高MySQL数据库的整体性能,而另一方面需要合理的结构设计和参数调整,以提高用户的相应速度,同时还要尽可能的节约系统资源,以便让系统提供更大的负荷

1 优化一览图

2 优化

笔者将优化分为了两大类,软优化和硬优化,软优化一般是 *** 作数据库即可,而硬优化则是 *** 作服务器硬件及参数设置

21 软优化

211 查询语句优化

1首先我们可以用EXPLAIN或DESCRIBE(简写:DESC)命令分析一条查询语句的执行信息

2例:

显示:

其中会显示索引和查询数据读取数据条数等信息

212 优化子查询

在MySQL中,尽量使用JOIN来代替子查询因为子查询需要嵌套查询,嵌套查询时会建立一张临时表,临时表的建立和删除都会有较大的系统开销,而连接查询不会创建临时表,因此效率比嵌套子查询高

213 使用索引

索引是提高数据库查询速度最重要的方法之一,关于索引可以参高笔者<MySQL数据库索引>一文,介绍比较详细,此处记录使用索引的三大注意事项:

214 分解表

对于字段较多的表,如果某些字段使用频率较低,此时应当,将其分离出来从而形成新的表,

215 中间表

对于将大量连接查询的表可以创建中间表,从而减少在查询时造成的连接耗时

216 增加冗余字段

类似于创建中间表,增加冗余也是为了减少连接查询

217 分析表,,检查表,优化表

分析表主要是分析表中关键字的分布,检查表主要是检查表中是否存在错误,优化表主要是消除删除或更新造成的表空间浪费

1 分析表: 使用 ANALYZE 关键字,如ANALYZE TABLE user;

2 检查表: 使用 CHECK关键字,如CHECK TABLE user [option]

option 只对MyISAM有效,共五个参数值:

3 优化表:使用OPTIMIZE关键字,如OPTIMIZE [LOCAL|NO_WRITE_TO_BINLOG] TABLE user;

LOCAL|NO_WRITE_TO_BINLOG都是表示不写入日志,优化表只对VARCHAR,BLOB和TEXT有效,通过OPTIMIZE TABLE语句可以消除文件碎片,在执行过程中会加上只读锁

22 硬优化

221 硬件三件套

1配置多核心和频率高的cpu,多核心可以执行多个线程

2配置大内存,提高内存,即可提高缓存区容量,因此能减少磁盘I/O时间,从而提高响应速度

3配置高速磁盘或合理分布磁盘:高速磁盘提高I/O,分布磁盘能提高并行 *** 作的能力

222 优化数据库参数

优化数据库参数可以提高资源利用率,从而提高MySQL服务器性能MySQL服务的配置参数都在mycnf或myini,下面列出性能影响较大的几个参数

223 分库分表

因为数据库压力过大,首先一个问题就是高峰期系统性能可能会降低,因为数据库负载过高对性能会有影响。另外一个,压力过大把你的数据库给搞挂了怎么办?所以此时你必须得对系统做分库分表 + 读写分离,也就是把一个库拆分为多个库,部署在多个数据库服务上,这时作为主库承载写入请求。然后每个主库都挂载至少一个从库,由从库来承载读请求。

224 缓存集群

如果用户量越来越大,此时你可以不停的加机器,比如说系统层面不停加机器,就可以承载更高的并发请求。然后数据库层面如果写入并发越来越高,就扩容加数据库服务器,通过分库分表是可以支持扩容机器的,如果数据库层面的读并发越来越高,就扩容加更多的从库。但是这里有一个很大的问题:数据库其实本身不是用来承载高并发请求的,所以通常来说,数据库单机每秒承载的并发就在几千的数量级,而且数据库使用的机器都是比较高配置,比较昂贵的机器,成本很高。如果你就是简单的不停的加机器,其实是不对的。所以在高并发架构里通常都有缓存这个环节,缓存系统的设计就是为了承载高并发而生。所以单机承载的并发量都在每秒几万,甚至每秒数十万,对高并发的承载能力比数据库系统要高出一到两个数量级。所以你完全可以根据系统的业务特性,对那种写少读多的请求,引入缓存集群。具体来说,就是在写数据库的时候同时写一份数据到缓存集群里,然后用缓存集群来承载大部分的读请求。这样的话,通过缓存集群,就可以用更少的机器资源承载更高的并发。

一个完整而复杂的高并发系统架构中,一定会包含:各种复杂的自研基础架构系统。各种精妙的架构设计因此一篇小文顶多具有抛砖引玉的效果,但是数据库优化的思想差不多就这些了

15 g 的数据库是很小的库了!这个量级正常是不应该存在慢的问题。

1慢可能是服务器的配置过低,尤其是阿里云服务器租用的配置太低了!感觉你说所的找不到存储过程好像就是阿里云最低配的问题。

2你们还用存储过程,和我们以前的系统一样,所有的业务逻辑都是存储过程完成,所以所有的压力都在数据库服务器上,服务器就容易卡,用存储过程还无法负载均衡。

3表的索引缺失或不合理,很重要的原因。

4使用了大量的触发器,触发器是开始一下爽,后来苦一生。坚决不用触发器,数据量大这个是要命的。

5存储过程里使用大量的link 访问其他数据库服务器,尤其是link 给远程库写数据;如果还写远程数据包含在分布式事务里这就更要命了。

日志1g 慢和它没一毛钱关系,就是占一点空间而已

随着信息时代的发展信息系统的使用越来越多 信息量越来越大 当信息量越来越大 这在数据展示 特别是报表这块对系统展现效率要求越来越高 对于千万级数据量的展示必须得使用分页来展示 If object_id( SP_Pagination )is not null drop proc SP_Pagination go Create PROCEDURE SP_Pagination /// 千万数量级分页存储过程 参数说明: Tables :表名称 视图(试图这边目前还有点小问题) PrimaryKey :主关键字 Sort :排序语句 不带Order By 比如 NewsID Desc OrderRows Asc CurrentPage :当前页码 PageSize :分页尺寸 Filter :过滤语句 不带Where Group :Group语句 不带Group By / ( @Tables varchar( ) @PrimaryKey varchar( ) @Sort varchar( ) = NULL @CurrentPage int = @PageSize int = @Fields varchar( ) = @Filter varchar( ) = NULL @Group varchar( ) = NULL ) AS ///默认排序/ IF @Sort IS NULL OR @Sort = SET @Sort = @PrimaryKey DECLARE @SortTable varchar( ) DECLARE @SortName varchar( ) DECLARE @strSortColumn varchar( ) DECLARE @operator char( ) DECLARE @type varchar( ) DECLARE @prec int ///设定排序语句 / IF CHARINDEX( DESC @Sort)> BEGIN SET @strSortColumn = REPLACE(@Sort DESC ) SET @operator = <= END ELSE BEGIN IF CHARINDEX( ASC @Sort) = print print REPLACE(@Sort ASC ) SET @strSortColumn = REPLACE(@Sort ASC ) print @strSortColumn SET @operator = >= print @operator END IF CHARINDEX( @strSortColumn) > BEGIN SET @SortTable = SUBSTRING(@strSortColumn CHARINDEX( @strSortColumn)) SET @SortName = SUBSTRING(@strSortColumn CHARINDEX( @strSortColumn) + LEN(@strSortColumn)) END ELSE BEGIN SET @SortTable = @Tables SET @SortName = @strSortColumn print @SortTable print @SortName END SELECT @type=t name @prec=c prec FROM sysobjects o JOIN syscolumns c on o id=c id JOIN systypes t on c xusertype=t xusertype WHERE o name = @SortTable AND c name = @SortName print @type print @prec IF CHARINDEX( char @type) > SET @type = @type + ( + CAST(@prec AS varchar) + ) DECLARE @strPageSize varchar( ) DECLARE @strStartRow varchar( ) DECLARE @strFilter varchar( ) DECLARE @strSimpleFilter varchar( ) DECLARE @strGroup varchar( ) ///默认当前页/ IF @CurrentPage < SET @CurrentPage = ///设置分页参数 / SET @strPageSize = CAST(@PageSize AS varchar( )) SET @strStartRow = CAST(((@CurrentPage )@PageSize + ) AS varchar( )) ///筛选以及分组语句 / IF @Filter IS NOT NULL AND @Filter != BEGIN SET @strFilter = WHERE + @Filter + SET @strSimpleFilter = AND + @Filter + END ELSE BEGIN SET @strSimpleFilter = SET @strFilter = END IF @Group IS NOT NULL AND @Group != SET @strGroup = GROUP BY + @Group + ELSE SET @strGroup = /print @type print @strStartRow print @strSortColumn print @Tables print @strFilter print @strGroup print @Sort/ ///执行查询语句/ EXEC( DECLARE @SortColumn + @type + SET ROWCOUNT + @strStartRow + SELECT @SortColumn= + @strSortColumn + FROM + @Tables + @strFilter + + @strGroup + ORDER BY + @Sort + SET ROWCOUNT + @strPageSize + SELECT + @Fields + FROM + @Tables + WHERE + @strSortColumn + @operator + @SortColumn + @strSimpleFilter + + @strGroup + ORDER BY + @Sort + )

下面是在数据库查询分析器里面怎么调用这个存储过程的实例 如图所示为Traffic_Sites原表查询的结果集 以Traffic_Sites表为例执行分页存储过程脚本 exec SP_Pagination Traffic_Sites Id Id asc 执行上述SQL结果如图所示   lishixinzhi/Article/program/SQLServer/201311/22256

既然是java不如试试Derby这个数据库,应该很符合你的要求而且网上资料很多哦在这里也不赘述了。

Derby是一个开源的、100%Java编写的、与平台无关的、易管理的关系数据库管理系统。Derby为用户提供了轻量的标准数据库引擎,它可以紧密的嵌入到任何基于Java的解决方案中。Derby确保数据完整性,并提供负责的事务处理 *** 作。默认的配置中不包含任何独立的数据库服务器。同时,Derby的安装过程非常简单,只需要将其jar文件复制到系统中并为您的项目添加该jar文件即可。

Derby拥有一个令人惊奇的特性列表。它可以支持关系数据库中的所有企业级的特性,包括崩溃恢复、事务回滚和提交、行/表级锁、视图、主键/外键约束、触发器、子查询表达式,等等。一部分的列表特性使Derby从其他的Java关系数据库管理系统中分离出来。

Derby可以有两种部署方式:

嵌入式:Derby被单个用户的Java应用程序使用,在这种模式下,Derby和应用程序运行在同一个JVM中。Derby对于终端用户几乎是透明的,因为它的启动和终止都是由应用程序来控制,而不需要任何的管理。

服务器模式:Derby由应用程序启动,此时通过用户可以通过网络连接。在这种模式下,Derby运行在服务器主机的JVM中。其他JVM的应用程序通过连接服务器来访问数据库。

分布式缓存主要用于在高并发环境下,减轻数据库的压力,提高系统的响应速度和并发吞吐。当大量的读、写请求涌向数据库时,磁盘的处理速度与内存显然不在一个量级,因此,在数据库之前加一层缓存,能够显著提高系统的响应速度,并降低数据库的压力。作为传统的关系型数据库,MySQL提供完整的ACID *** 作,支持丰富的数据类型、强大的关联查询、where语句等,能够非常客易地建立查询索引,执行复杂的内连接、外连接、求和、排序、分组等 *** 作,并且支持存储过程、函数等功能,产品成熟度高,功能强大。但是,对于需要应对高并发访问并且存储海量数据的场景来说,出于对性能的考虑,不得不放弃很多传统关系型数据库原本强大的功能,牺牲了系统的易用性,并且使得系统的设计和管理变得更为复杂。这也使得在过去几年中,流行着另一种新的存储解决方案——NoSQL,它与传统的关系型数据库最大的差别在于,它不使用SQL作为查询语言来查找数据,而采用key-value形式进行查找,提供了更高的查询效率及吞吐,并且能够更加方便地进行扩展,存储海量数据,在数千个节点上进行分区,自动进行数据的复制和备份。在分布式系统中,消息作为应用间通信的一种方式,得到了十分广泛的应用。消息可以被保存在队列中,直到被接收者取出,由于消息发送者不需要同步等待消息接收者的响应,消息的异步接收降低了系统集成的耦合度,提升了分布式系统协作的效率,使得系统能够更快地响应用户,提供更高的吞吐。

当系统处于峰值压力时,分布式消息队列还能够作为缓冲,削峰填谷,缓解集群的压力,避免整个系统被压垮。垂直化的搜索引擎在分布式系统中是一个非常重要的角色,它既能够满足用户对于全文检索、模糊匹配的需求,解决数据库like查询效率低下的问题,又能够解决分布式环境下,由于采用分库分表,或者使用NoSQL数据库,导致无法进行多表关联或者进行复杂查询的问题。

在我们使用MySQL数据库时,比较常用也是查询,包括基本查询,关联查询,条件查询等等,对于同一个 *** 作,SQL语句的实现有很多种写法,但是不同的写法查询的性能可能会有很大的差异。这里主要介绍下select查询优化的要点。

1 使用慢查询日志去发现慢查询。

2 使用执行计划去判断查询是否正常运行。

3 总是去测试你的查询看看是否他们运行在最佳状态下 –久而久之性能总会变化。

4 避免在整个表上使用count(),它可能锁住整张表。

5 使查询保持一致以便后续相似的查询可以使用查询缓存。

6 在适当的情形下使用GROUP BY而不是DISTINCT。

7 在WHERE, GROUP BY和ORDER BY子句中使用有索引的列。

8 保持索引简单,不在多个索引中包含同一个列。

9 有时候MySQL会使用错误的索引,对于这种情况使用USE INDEX。

10 检查使用SQL_MODE=STRICT的问题。

11对于记录数小于5的索引字段,在UNION的时候使用LIMIT不是是用OR

12 为了 避免在更新前SELECT,使用INSERT ON DUPLICATE KEY或者INSERT IGNORE ,不要用UPDATE去实现。

3 不要使用 MAX,使用索引字段和ORDER BY子句。

14 避免使用ORDER BY RAND()

15 LIMIT M,N实际上可以减缓查询在某些情况下,有节制地使用。

16 在WHERE子句中使用UNION代替子查询。

17 对于UPDATES(更新),使用 SHARE MODE(共享模式),以防止独占锁。

18 在重新启动的MySQL,记得来温暖你的数据库,以确保您的数据在内存和查询速度快。

19 使用DROP TABLE,CREATE TABLE DELETE FROM从表中删除所有数据。

20 最小化的数据在查询你需要的数据,使用消耗大量的时间。

21 考虑持久连接,而不是多个连接,以减少开销。

22 基准查询,包括使用服务器上的负载,有时一个简单的查询可以影响其他查询。

23 当负载增加您的服务器上,使用SHOW PROCESSLIST查看慢的和有问题的查询。

24 在开发环境中产生的镜像数据中 测试的所有可疑的查询。

来源:PHP程序员雷雪松的博客

以上就是关于当对数据库进行海量级的数据插入时,数据库出现报错,错误原因可能有哪些全部的内容,包括:当对数据库进行海量级的数据插入时,数据库出现报错,错误原因可能有哪些、超详细MySQL数据库优化、数据库高手请进 数据文件过大的问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9332577.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-27
下一篇 2023-04-27

发表评论

登录后才能评论

评论列表(0条)

保存