MySQL数据库性能优化之分区分表分库

MySQL数据库性能优化之分区分表分库,第1张

分表是分散数据库压力的好方法。

分表,最直白的意思,就是将一个表结构分为多个表,然后,可以再同一个库里,也可以放到不同的库。

当然,首先要知道什么情况下,才需要分表。个人觉得单表记录条数达到百万到千万级别时就要使用分表了。

分表的分类

**1、纵向分表**

将本来可以在同一个表的内容,人为划分为多个表。(所谓的本来,是指按照关系型数据库的第三范式要求,是应该在同一个表的。)

分表理由:根据数据的活跃度进行分离,(因为不同活跃的数据,处理方式是不同的)

案例:

对于一个博客系统,文章标题,作者,分类,创建时间等,是变化频率慢,查询次数多,而且最好有很好的实时性的数据,我们把它叫做冷数据。而博客的浏览量,回复数等,类似的统计信息,或者别的变化频率比较高的数据,我们把它叫做活跃数据。所以,在进行数据库结构设计的时候,就应该考虑分表,首先是纵向分表的处理。

这样纵向分表后:

首先存储引擎的使用不同,冷数据使用MyIsam 可以有更好的查询数据。活跃数据,可以使用Innodb ,可以有更好的更新速度。

其次,对冷数据进行更多的从库配置,因为更多的 *** 作时查询,这样来加快查询速度。对热数据,可以相对有更多的主库的横向分表处理。

其实,对于一些特殊的活跃数据,也可以考虑使用memcache ,redis之类的缓存,等累计到一定量再去更新数据库。或者mongodb 一类的nosql 数据库,这里只是举例,就先不说这个。

**2、横向分表**

字面意思,就可以看出来,是把大的表结构,横向切割为同样结构的不同表,如,用户信息表,user_1,user_2等。表结构是完全一样,但是,根据某些特定的规则来划分的表,如根据用户ID来取模划分。

分表理由:根据数据量的规模来划分,保证单表的容量不会太大,从而来保证单表的查询等处理能力。

案例:同上面的例子,博客系统。当博客的量达到很大时候,就应该采取横向分割来降低每个单表的压力,来提升性能。例如博客的冷数据表,假如分为100个表,当同时有100万个用户在浏览时,如果是单表的话,会进行100万次请求,而现在分表后,就可能是每个表进行1万个数据的请求(因为,不可能绝对的平均,只是假设),这样压力就降低了很多很多。

延伸:为什么要分表和分区

日常开发中我们经常会遇到大表的情况,所谓的大表是指存储了百万级乃至千万级条记录的表。这样的表过于庞大,导致数据库在查询和插入的时候耗时太长,性能低下,如果涉及联合查询的情况,性能会更加糟糕。分表和表分区的目的就是减少数据库的负担,提高数据库的效率,通常点来讲就是提高表的增删改查效率。

什么是分表?

分表是将一个大表按照一定的规则分解成多张具有独立存储空间的实体表,我们可以称为子表,每个表都对应三个文件,MYD数据文件,.MYI索引文件,.frm表结构文件。这些子表可以分布在同一块磁盘上,也可以在不同的机器上。app读写的时候根据事先定义好的规则得到对应的子表名,然后去 *** 作它。

什么是分区?

分区和分表相似,都是按照规则分解表。不同在于分表将大表分解为若干个独立的实体表,而分区是将数据分段划分在多个位置存放,可以是同一块磁盘也可以在不同的机器。分区后,表面上还是一张表,但数据散列到多个位置了。app读写的时候 *** 作的还是大表名字,db自动去组织分区的数据。

**MySQL分表和分区有什么联系呢?**

1、都能提高mysql的性高,在高并发状态下都有一个良好的表现。

2、分表和分区不矛盾,可以相互配合的,对于那些大访问量,并且表数据比较多的表,我们可以采取分表和分区结合的方式(如果merge这种分表方式,不能和分区配合的话,可以用其他的分表试),访问量不大,但是表数据很多的表,我们可以采取分区的方式等。

3、分表技术是比较麻烦的,需要手动去创建子表,app服务端读写时候需要计算子表名。采用merge好一些,但也要创建子表和配置子表间的union关系。

4、表分区相对于分表, *** 作方便,不需要创建子表。

我们知道对于大型的互联网应用,数据库单表的数据量可能达到千万甚至上亿级别,同时面临这高并发的压力。Master-Slave结构只能对数据库的读能力进行扩展,写 *** 作还是集中在Master中,Master并不能无限制的挂接Slave库,如果需要对数据库的吞吐能力进行进一步的扩展,可以考虑采用分库分表的策略。

**1、分表**

在分表之前,首先要选中合适的分表策略(以哪个字典为分表字段,需要将数据分为多少张表),使数据能够均衡的分布在多张表中,并且不影响正常的查询。在企业级应用中,往往使用org_id(组织主键)做为分表字段,在互联网应用中往往是userid。在确定分表策略后,当数据进行存储及查询时,需要确定到哪张表里去查找数据,

数据存放的数据表 = 分表字段的内容 % 分表数量

**2、分库**

分表能够解决单表数据量过大带来的查询效率下降的问题,但是不能给数据库的并发访问带来质的提升,面对高并发的写访问,当Master无法承担高并发的写入请求时,不管如何扩展Slave服务器,都没有意义了。我们通过对数据库进行拆分,来提高数据库的写入能力,即所谓的分库。分库采用对关键字取模的方式,对数据库进行路由。

数据存放的数据库=分库字段的内容%数据库的数量

**3、即分表又分库**

数据库分表可以解决单表海量数据的查询性能问题,分库可以解决单台数据库的并发访问压力问题。

当数据库同时面临海量数据存储和高并发访问的时候,需要同时采取分表和分库策略。一般分表分库策略如下:

中间变量 = 关键字%(数据库数量*单库数据表数量)

库 = 取整(中间变量/单库数据表数量)

表 = (中间变量%单库数据表数量)

实例:

1、分库分表

很明显,一个主表(也就是很重要的表,例如用户表)无限制的增长势必严重影响性能,分库与分表是一个很不错的解决途径,也就是性能优化途径,现在的案例是我们有一个1000多万条记录的用户表members,查询起来非常之慢,同事的做法是将其散列到100个表中,分别从members0到members99,然后根据mid分发记录到这些表中,牛逼的代码大概是这样子:

复制代码 代码如下:

<?php

for($i=0$i<100$i++ ){

//echo "CREATE TABLE db2.members{$i} LIKE db1.members

"

echo "INSERT INTO members{$i} SELECT * FROM members WHERE mid%100={$i}

"

}

?>

2、不停机修改mysql表结构

同样还是members表,前期设计的表结构不尽合理,随着数据库不断运行,其冗余数据也是增长巨大,同事使用了下面的方法来处理:

先创建一个临时表:

/*创建临时表*/

CREATE TABLE members_tmp LIKE members

然后修改members_tmp的表结构为新结构,接着使用上面那个for循环来导出数据,因为1000万的数据一次性导出是不对的,mid是主键,一个区间一个区间的导,基本是一次导出5万条吧,这里略去了

接着重命名将新表替换上去:

/*这是个颇为经典的语句哈*/

RENAME TABLE members TO members_bak,members_tmp TO members

就是这样,基本可以做到无损失,无需停机更新表结构,但实际上RENAME期间表是被锁死的,所以选择在线少的时候 *** 作是一个技巧。经过这个 *** 作,使得原先8G多的表,一下子变成了2G多。

SQL Server是基于服务器端的中型的数据库,可以适合大容量数据的应用,在功能上管理上也要比Access要强得多。在处理海量数据的效率,后台开发的灵活性,可扩展性等方面强大。因为现在数据库都使用标准的SQL语言对数据库进行管理,所以如果是标准SQL语言,两者基本上都可以通用的。SQL Server还有更多的扩展,可以用存储过程,数据库大小无极限限制

DB2是IBM出口的一系列关系型数据库管理系统,分别在不同的 *** 作系统平台上服务。虽然DB2产品是基于UNIX的系统和个人计算机 *** 作系统,在基于UNIX系统和微软在windows系统下的Access方面,DB2追寻了ORACLE的数据库产品。

这款新型数据服务器率先实现了可扩展标记语言(XML)和关系数据间无缝交互,而无需考虑数据的格式、平台或位置。来自8个国家的750多名软件开发人员为“Viper”的问世做出了努力,他们进行了精心设计和调试,力求将其打造成SOA环境下的首选信息引擎.? DB2 9取得了十项重大进步,包括已获得专利的“pureXML”技术、突破性的“Venom”存储压缩以及增强的自动化数据管理能力等。

1、新的XML特性:

在无需重新定义XML数据的格式,或将其置于数据库大型对象中的前提下,IBM DB2 9允许用户无缝管理普通关系数据和纯XML数据。此项能力是Viper所独有的,它将有助于客户增加其信息的实用性、速度和多功能性,同时大大降低与现有数据管理技术相关的管理成本。它还将显著降低复杂性,并减少普通开发商创建“同时访问关系数据和XML数据的应用”所花费的时间。

新的XML数据类型,允许客户在分层的表格栏中存储规范的XML文档。

支持SQL语句及SQL/XML函数中的XML数据类型。

支持由万维网联盟(W3C)开发的新XQuery语言。IBM DB2 9允许客户直接调用XQuery语言,调用功能可以从DB2表格与视图中提取XML数据。

支持XML数据的检索功能,提高了针对XML文档的查询效率。

为支持DB2的编程程序语言中的XML提供支持,允许应用整合对XML及关系型数据的访问和存储。

2、新的应用与开发特性:

对应用开发工具和原生XML数据存储新特性的支持,允许应用访问和存储XML及相关数据。

DB2 Developer Workbench是一种综合开发环境,可用于创建、编辑、调试、测试和部署DB2存储流程和用户自定义的功能。客户还可以使用Developer Workbench开发SQL应用,创建、编辑和运行SQL语句与XML查询。

面向JDBC和SQLJ的增强型DB2驱动程序符合JDBC 3.0规范,它还同时支持SQLJ语句。

SQLJ语句的功能特性与大多数JDBC方法相似。

此外,还包括其它重要特性:支持众多新数据类型、DB2独有的支持到面向z/OS? 数据服务器IBM DB2 9版可靠连接的方式、异构组合、连接重用等。除支持Visual Studio 2005以外,还包括对Web服务的支持,对本地XML数据存储的全面支持,以及无需编写代码就可以构建应用及Web站点的能力。增强型DB2 Runtime Client支持64位计算,还可在同一台计算机上与其它DB2产品共存。

3、新增自动数据库管理功能:

适应性、自调式内存分配,通过不断更新配置参数、调整缓冲池大小和动态分配可用的内存资源,帮助用户简化或排除DB2服务器的配置工作。面向z/OS对象的DB2 UDB自动状态检测功能,允许客户通过控制中心的创建和变更对象策略向导,使面向z/OS对象的DB2 UDB实现对象维护策略评估自动化。

自动存储支持,可以自动扩充磁盘和文件系统中数据库的大小,现在可用于多分区数据库。

自动统计数据收集,创建新数据库时会自动启动。

根据DB2数据库系统的环境特点,自动配置prefetchers进程与页清洁器。

面向自动表格与索引重组的新策略选项,为数据库管理员提供更多管理表格与索引重组的功能。

4、性能与可扩展性增强(存储压缩等):

利用数据行压缩技术压缩数据对象的功能,可以帮助客户节省磁盘存储空间,并加快数据访问速度。

统计数据视图,为改进查询功能提供更出色的访问计划。

使用定制的脚本或程序加快数据载入速度。

增强型物化查询表(MQT)可为设计MQT提供更强大地支持,更出色的查询性能和更完善的MQT维护。

更大的记录标识符(RID)允许每个对象拥有更多数据页,系统中每页拥有更多记录,一方面为数据库管理员使用系统和用户的临时表格提供了便利,另一方面也便于执行分类和登录 *** 作。

索引的关键字最多可达64组,大小可以扩充至8 KB。

5、新的安全特性与增强:

使用基于标签的访问控制(LBAC),改进行、列级别的数据访问控制功能。

新安全管理器(SECADM)的授权级别,将若干个与安全性相关的优先权集中到一项优先权名下,提高了对于访问信息资产的控制。

“创建数据库”语句中新增的“限制”选项,增强了对进入数据库的控制。

SETSESSIONUSER优先权加强了对拥有转换会话用户身份权力的人的控制。它允许掌握该项权力的人转换为任何被赋予权利的授权ID。

TRANSFER OWNERSHIP SQL语句,提供了改变数据库对象的归属权的能力。

6、使用表格分区改进大型数据库管理:

表格分区是一种数据组织计划,在该计划中,表格数据根据多个表格列,被划分到多个被称为表格分区或范围的存储对象中。这些存储对象可能存放在不同的表空间或相同的表空间中,或两种情况兼而有之。此项新特性的优势包括:

能够创建非常大的表格。分区表格包含的数据远远超过了普通表格。将表格数据划分到众多存储对象中,有助于显著增加表格尺寸。

更灵活的管理能力。现在,客户可以在个别数据分区中完成管理工作,将消耗时间的维护 *** 作分成一系列小型 *** 作。

更加精确地控制索引位置。客户可以将索引放置在不同的表空间,分别对其进行管理。

快速、轻松地访问数据或转出数据。这一功能在数据仓库环境中尤为有用,客户经常在此环境中移入或移出数据,运行支持决策的查询。

改进的查询功能。通过表格分区分离数据,避免对不相关数据进行扫描,从而改进查询处理的功能。

7、数据恢复增强:

重新启动中断的恢复 *** 作,可以在数据库恢复时节省宝贵的时间,同时简化恢复工作。

支持重定向恢复 *** 作,在现有备份镜像中自动生成脚本。

能够从表空间备份镜像中重新构建数据库。此项功能让DB2的恢复更加灵活和多样化,同时为客户提供更全面的恢复解决方案。

8、自主管理性能增强:

使用适应性、自调内存分配简化了内存管理。自调内存提供动态配置,能对工作负载特性的重大变化做出积极响应。

客户创建数据库时,自动统计数据收集功能会自动启动。凭借自动统计数据收集,IBM DB2 9版自动在后台运行RUNSTATS实用程序,确保收集到正确的统计数据,并进行维护。

面向多分区数据库的自动存储支持。这一功能可以按照需求,自动扩大磁盘和文件系统中数据库的容量。

ALTER TABLE语句增强允许客户无需停止或重新创建表格,就可以改变部分表格的属性。

新的策略选项为数据库管理员提供了新的表格和索引自动重组功能。

可以拷贝数据库计划,创建模块方案。一旦数据库管理员创建了模块方案,他们就可将其作为创建新视图的模板。

新的管理SQL例程和视图提供了基本、易用的可编程界面,便于借助SQL来管理DB2。

动态快速通信管理器(FCM)缓冲和新的配置参数,可通过DB2数据库管理器进行自动调节。

9、安装性能增强:

新的CLI驱动程序(面向ODBC和CLI的IBM? DB2驱动程序),客户可以在不安装DB2客户端软件的情况下安装此驱动程序。

更加灵活、有效的产品授权管理

可以在同一台计算机上安装多个DB2版本和修补包。

新的响应文件关键字允许IT员工无需与最终用户交互安装DB2产品。

自动演进 — 从Stinger到Viper

基于第8.2版推出的增强功能,IBM DB2 9版中新的自动数据管理特性将继续帮助提高数据库管理员的生产效率和效用。

其中一些关键特性包括:

适应性、自调内存分配功能此项新功能通过不断更新配置参数和重新调整缓冲池的大小,简化或排除了DB2服务器的配置工作。一旦启动,该功能可在不同内存消耗点之间,动态分配可用的内存资源。在Windows和AIX? *** 作系统中,自调内存功能也可以确定数据库内存总体需求,并会自动调节数据库共享内存。

面向 z/OS对象的DB2 UDB自动状态监测功能 通过控制中心的创建和变更对象策略向导,客户可以实现面向z/OS对象的DB2 UDB对象维护策略评估的自动化,从而可使其按照预定次数和时间间隔运行。对创建了策略警报的对象而言,警报通知会发送至对象维护策略指定的状况警报联系处。

自动存储支持 自动存储可以自动扩大磁盘与文件系统中数据库的容量。它消除了对管理存储器的需求,同时利用了数据库管理存储的性能和灵活性。在IBM DB2 9版中,已经添加了面向多分区数据库的自动存储功能。此外,在创建新数据库时,自动存储会自动启动。

自动统计数据收集 在IBM DB2 9版中,当创建新数据库时,使用RUNSTATS命令的自动统计数据收集功能会自动启动。必要时,DB2服务器会在后台处理中收集数据的统计信息。

DB2优化器(DB2 optimizer)利用这些信息对数据库中的信息最有效地恢复。

prefetchers进程和页清洁器的自动配置 在IBM DB2 9版中,prefetchers进程与页清洁器的数量可由DB2数据库系统根据某些环境特性,如CPU的数量、数据库分区的数量和数据库表空间的并行设置,自动确定。

表格与索引自动重组功能增强 表格与索引重组的新策略选项,为数据库管理员提供了更丰富的表格与索引重组管理功能。

oracle和SQL SERVER都是用SQL语句可以编写数据库,但语法有区别,我楼上说的SQL SERVER说不稳定,也不一定吧~这里我说的都是正版,不过ORACLE确实是现在企业用的多~不过ORACLE可不只是能用JAVA写,要弄清楚ORACLE和SQL SERVER都是数据库,每个软件都有针数据库编程的语法。真正编数据库可以用ORACLE中SQL语句来写。而且真正完全用SQL SERVER的功能也不一定是容易。现在微软的SQL 2000 有一个比较好的特点就是能处理100用户内的并发问题~最新SQL SERVER2005情况还真没过~它们在国际上价格差不多。


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存