当前位置:文档之家› MySQL自动分区扩展

MySQL自动分区扩展

MySQL实现定时建立删除分区

来源:中国自学编程网发布日期:2008-09-29

最近需要把一个oralce数据库向mysql数据库移植。oracle库用到了job和存储过程,因为mysql中没有job,所有要用新功能event代替一下,这个是5.1以后才有的新功能,所以稍微研究了一下。

原来需要实现的功能是每间隔一段时间就会建立几个分区,并删除几个分区,以保持数据库只存一段时间内的数据,以下是实现步骤

1)首先我们建立表,这个时候就遇到了一点问题,因为mysql PARTITION BY RANGE 的时候只支持按数字类型进行分区,所以不支持直接用date类型分区,而且有很多函数不能在PARTITION BY RANGE 中使用,所以我使用了到公元元年的描述作为划分分区的依据

CREATE TABLE `data_table` (

`dtime` datetime NOT NULL,

`alarm_no` int(8) NOT NULL,

`alarm_level` int(1) NOT NULL,

`color_index` int(1) NOT NULL,

`server_name` varchar(64) NOT NULL,

`process_name` varchar(64) NOT NULL,

`desciption` varchar(600) NOT NULL

) ENGINE=MyISAM DEFAULT CHARSET=gb2312 /*!50100 PARTITION BY RANGE

(TO_DAYS(dtime)*24*60*60+TIME_TO_SEC(dtime)) (PARTITION p0 VALUES LESS THAN (0) ENGINE = MyISAM) */;

2)然后我们建立存储过程

这里是添加表部分的实现,第2个存储过程调用第一个存储过程,control表中存的是一些参数,值得注意的时,因为有可能插入重复的分区,所有我们进行了异常处理,如果出现重复分区异常我们会跳过这次循环继续

delimiter //

CREATE PROCEDURE `gen_partion_script_proc`(spec_date DATETIME, table_name VARCHAR(64), table_space VARCHAR(64), prefix VARCHAR(64), key_type INTEGER(10), qty_day INTEGER(10))

NOT DETERMINISTIC

SQL SECURITY DEFINER

COMMENT ''

begin

declare repeated int default 0;

declare result varchar(256);

declare par_name varchar(128);

declare verrinfo varchar(200);

declare fdbk int(10);

declare v_sqlcursor int(10);

declare v_num int(10);

declare i integer(10);

declare continue handler for 1493 set repeated=1;

declare continue handler for 1517 set repeated=1;

set i = 1;

dayloop :

loop

if i > qty_day then leave dayloop;

end if;

set par_name = concat(prefix,

date_format(spec_date, '%Y%m%d'),

case when char_length(i) < 2 then concat('0', i) else i end);

if key_type = 1 then

set @par_value = round((to_days(spec_date) + i / qty_day) * 24 * 60 * 60); end if;

set result = concat('alter table ',

table_name,

' add partition (partition ',

par_name,

' values less than (',

@par_value,

'))');

set @v_sql = result;

prepare stmt from @v_sql;

execute stmt;

set i = i + 1;

end loop;

end;

CREATE PROCEDURE `procaddpart`(p_datefrom DATETIME, p_days INTEGER(10)) NOT DETERMINISTIC

SQL SECURITY DEFINER

COMMENT ''

begin

declare done int default 0;

declare v_table varchar(64);

declare v_tablespace varchar(64);

declare v_prefix varchar(64);

declare v_keytype integer(10);

declare v_qty_day integer(10);

declare verrinfo varchar(200);

declare i integer(10);

declare partion_control cursor for

select table_name, tablesapace, prefix, qty_day, key_type

from control;

declare continue handler for not found set done = 1;

set i=1;

open partion_control;

repeat

fetch partion_control into v_table, v_tablespace, v_prefix, v_qty_day, v_keytype;

until done

end repeat;

close partion_control;

dayloop:loop

if i>p_days then

leave dayloop;

end if;

call gen_partion_script_proc (adddate(adddate(p_datefrom,i), -1),

v_table,

v_tablespace,

v_prefix,

v_keytype,

v_qty_day

);

set i=i+1;

end loop;

end;

下面是删除分区过程

CREATE PROCEDURE `remove_partition_script_proc`(spec_date DATETIME, table_name VARCHAR(64), prefix VARCHAR(64), qty_day INTEGER(10))

NOT DETERMINISTIC

SQL SECURITY DEFINER

COMMENT ''

begin

declare par_name varchar(128);

declare result varchar(256);

declare i integer(10);

declare repeated int default 0;

declare continue handler for 1507 set repeated=1;

set i=1;

dayloop:loop

if i>qty_day then

leave dayloop;

end if;

set par_name=concat(prefix,date_format(spec_date,'%Y%m%d'),case when

char_length(i)<2 then concat('0',i) else i end);

set result=concat('alter table ',table_name,' drop partition ',par_name); set @v_sql=result;

prepare stmt from @v_sql;

execute stmt;

set i=i+1;

end loop;

end;

CREATE PROCEDURE `procdelpart`(p_date DATETIME)

NOT DETERMINISTIC

SQL SECURITY DEFINER

COMMENT ''

begin

declare done int default 0;

declare v_table varchar(64);

declare v_prefix varchar(64);

declare v_qty_day integer(10);

declare partion_control cursor for

select table_name, prefix, qty_day

from partition_control_tab;

declare continue handler for not found set done = 1;

set @i=0;

open partion_control;

repeat

fetch control into v_table,v_prefix,v_qty_day;

if not done then

set @i=@i+1;

call remove_partition_script_proc(p_date,v_table,v_prefix,v_qty_day); end if;

until done

end repeat;

close partion_control;

commit;

end;CREATE PROCEDURE `report_job`(pdate DATETIME)

NOT DETERMINISTIC

SQL SECURITY DEFINER

COMMENT ''

begin

commit;

select data_keeped_days

into @keeped_days

from config;

if @keeped_days > 0

then

call procdelpart (adddate(pdate,-@keeped_days));

end if;

commit;

end;

3)最后我们建立event,跟 oracle的job作用一样,定时执行任务。在建立event 以后,我们最好把mysql服务器上的https://www.doczj.com/doc/267027291.html,f或my.ini里面[mysqld]里面加上

event_scheduler=1,这样就默认开启event功能了

CREATE EVENT event1

ON SCHEDULE EVERY 1 day

STARTS ADDDATE(CURDATE()+INTERVAL 1 DAY,INTERVAL 90 minute )--每隔一天早上1:30定时执行

ON COMPLETION PRESERVE ENABLE

DO call procaddpart(now(),3);

CREATE EVENT event2

ON SCHEDULE EVERY 1 day

STARTS ADDDATE(CURDATE()+INTERVAL 1 DAY,INTERVAL 150 minute )--每隔一天早上2:30定时执行

ON COMPLETION PRESERVE ENABLE

DO call report_job(ADDDATE(now(),-1));

这样我们就完成了这个功能,每天早上就会自动执行增加删除分区操作了!

感觉mysql越来越强大了,功能也越来越接近企业级数据库。希望大家也能更加重视mysql数据库,研究他并发掘他的潜力。

734794

CREATE TABLE MyISAM_Partition (

Id INT(4) UNSIGNED auto_increment,

IMSI varchar (20) NOT NULL ,

MTYPE varchar (20) NOT NULL ,

TEID varchar (20) NULL ,

LAC int NOT NULL ,

CID int NOT NULL ,

SAC int NOT NULL ,

MNC varchar (20) NULL ,

Mobile varchar (20) NULL ,

SOURCE_IP varchar (15) NULL ,

IMEI varchar (20) NULL ,

APN varchar (65) NULL ,

bsid varchar (15) NULL ,

uati varchar (32) NULL ,

meid varchar (15) NULL ,

GET_TIME datetime,

SAVE_TIME datetime NULL,

PRIMARY KEY(Id,GET_TIME)) ENGINE = MyISAM default character set gbk PARTITION BY RANGE (to_days(GET_TIME)) (

PARTITION p01 VALUES LESS THAN (to_days('2011-10-19')));

CREATE INDEX IX_Imsi_MyISAM_Partition_GETTIME ON MyISAM_Partition(GET_TIME DESC);

CREATE INDEX IX_Imsi_MyISAM_Partition ON MyISAM_Partition(IMSI); CREATE INDEX IX_Imsi_MyISAM_Partition_IP ON MyISAM_Partition(SOURCE_IP); CREATE INDEX IX_Imsi_MyISAM_Partition_Mobile ON MyISAM_Partition(Mobile); CREATE INDEX IX_Imsi_MyISAM_Partition_TEID ON MyISAM_Partition(TEID);

delimiter //

create procedure procaddpart(spec_date datetime)

not deterministic

sql security definer

comment ''

begin

declare result varchar(256);

declare par_name varchar(128);

set par_name=concat(date_format(spec_date,'%Y%m%d'),'01');

set @par_value=to_days(spec_date);

set result = concat('alter table MyISAM_Partition add partition(partition ',par_name,' values less than(',@par_value,'))');

set @v_sql=result;

prepare stmt from @v_sql;

execute stmt;

end;

//

delimiter ;

create event event_test2

on schedule every 1 second

on completion preserve enable

DO CALL procaddpart(now());

show create table MyISAM_Partition;

create event event_test3

on schedule every 1 second

on completion preserve enable

DO CALL procaddpart('2011-10-22');

show create table MyISAM_Partition;

-- 关闭事件

ALTER EVENT event_test2 ON

COMPLETION PRESERVE DISABLE;

REPLACE(partition_name,'p','') : 把INFORMATION_SCHEMA.PARTITIONS 表中的partition_name字段中的'p'字符替换成''字符。

CREATE TABLE par_sky_monitor_data(

id bigint(20) NOT NULL AUTO_INCREMENT COMMENT '唯一id,自然主键', rcvtime datetime NOT NULL COMMENT '数据接收时间',

partnerid int(11) NOT NULL COMMENT '合作伙伴标识',

version tinyint(4) NOT NULL COMMENT '结构版本号',

PRIMARY KEY (id,rcvtime)

) ENGINE=InnoDB DEFAULT CHARSET=gbk

PARTITION BY RANGE (to_days(rcvtime))

(PARTITION p2******* VALUES LESS THAN (to_days('2011-10-01')), PARTITION p2******* VALUES LESS THAN (to_days('2011-10-02')), PARTITION p2******* VALUES LESS THAN (to_days('2011-10-03'))); create index I_par_sky_rcvtime on par_sky_monitor_data(rcvtime);

delimiter //

DROP PROCEDURE IF EXISTS set_partition //

create procedure set_partition()

begin

postgresql和oracle表分区对比

PostgreSQL和oracle表分区对比 PostgreSQL是开源数据库,完全免费,oracle是有强大厂商支持和维护的数据库,把这两个的表分区特性放在一起对比,似乎有些勉强。但对于我们多了解一些特性,在实际开发中可以更好地进行理性选择和快速入手。

总结,数据库的表分区特性优点很多,比如: 1、改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速度。

2、增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 3、维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 4、均衡I/O:可以把不同的分区映射到磁盘以平衡I/O,改善整个系统性能。 5、将很少用的数据可以移动到便宜的、慢一些地存储介质上。 这两种数据库的分区表都具有这些优点。 对比来说,Oracle的分区创建和管理更加方便,很多工作是由oracle的内部机制来实现的。postgreSQL的分区表其实是一个个实际存在的数据表,分区的创建和管理都需要我们用语言来控制,增加了应用人员的工作量。 但,由于oracle自身的“侵占式”硬盘存储,对过期数据进行清除时,即便是drop分区表,也不能直接释放硬盘空间,属于“占了就占了”,这个管理起来就比较麻烦,除非对每个分区表都建立各个独立的tablespace,放在独立的物理文件上,删除过期分区表时,可以同时drop tablespace including contents。而postgreSQL在truncate 分区表时,可以直接释放硬盘,会看到硬盘使用率下降了,这一点对硬盘资源紧张时,就非常好了。 两种数据库的分区表使用,各有利弊,但总的来说,比较偏向postgreSQL,毕竟硬盘有限。而且,oracle收费。 Ps,在数据量很大时,任何关系型数据库都有性能上的瓶颈,不属于我们这两种数据库分区表对比的范围了。 以上,是一些使用中的总结,还请达人们指教:)。

PHP+AJAX教程(5)-AJAX MySQL数据库实例

PHP+AJAX教程(5):AJAX MySQL数据库实例 AJAX 可用来与数据库进行交互式通信。 AJAX 数据库实例 在下面的AJAX 实例中,我们将演示网页如何使用AJAX 技术从MySQL 数据库中读取信息。 在下拉列表中选择一个名字(测试说明:该实例功能未实现) 在此列出用户信息。 此列由四个元素组成: MySQL 数据库 简单的HTML 表单 JavaScript PHP 页面 数据库 将在本例中使用的数据库看起来类似这样: id FirstName LastName Age Hometown Job 1 Peter Griffin 41 Quahog Brewery 2 Lois Griffin 40 Newport Piano Teacher 3 Joseph Swanson 39 Quahog Police Officer 4 Glenn Quagmire 41

Quahog Pilot HTML 表单 上面的例子包含了一个简单的HTML 表单,以及指向JavaScript 的链接: <html><head><script src="selectuser.js"></script></head><body><form> Select a User:<select name="users" onchange="showUser(this.value)"><option value="1">Peter Griffin</option><option value="2">Lois Griffin</option><option value="3">Glenn Quagmire</option><option value="4">Joseph Swanson</option></select></form><p><div id="txtHint"><b>User info will be listed here.</b></div></p></body></html> 例子解释- HTML 表单 正如您看到的,它仅仅是一个简单的HTML 表单,其中带有名为"users" 的下拉列表,okooo澳客网这个列表包含了姓名,以及与数据库的"id" 对应的选项值。 表单下面的段落包含了名为"txtHint" 的div。这个div 用作从web 服务器检索到的信息的占位符。 当用户选择数据时,执行名为"showUser()" 的函数。该函数的执行由"onchange" 事件触发。 换句话说:每当用户改变下拉列表中的值,就会调用showUser() 函数。 JavaScript 这是存储在"selectuser.js" 文件中的JavaScript 代码: var xmlHttpfunction showUser(str){ xmlHttp=GetXmlHttpObject()if (xmlHttp==null){alert ("Browser does not support HTTP Request")return}var url="getuser.php"url=url+"?q="+strurl=url+"&sid="+Mat h.random()xmlHttp.onreadystatechange=stateChanged xmlHttp.open("GET",url,true)xmlHttp.send(null)}function stateChanged() { if (xmlHttp.readyState==4 || xmlHttp.readyState=="complete"){ document.getElementById("txtHint").i nnerHTML=xmlHttp.responseText } }function GetXmlHttpObject(){var xmlHttp=null;try{// Firefox, Opera 8.0+, SafarixmlHttp=new XMLHttpRequest();}catch (e){//Internet Explorertry { xmlHttp=new ActiveXObject("Msxml2.XMLHTTP"); }catch (e) { xmlHttp=new ActiveXObject("Microsoft.XMLHTTP"); }}return xmlHttp;} 例子解释: stateChanged() 和GetXmlHttpObject 函数与PHP AJAX 请求那一节中的相同,您可以参阅其中的相关解释。 showUser() 函数 假如下拉列表中的项目被选择,函数执行: 调用GetXmlHttpObject 函数来创建XMLHTTP 对象定义发送到服务器的URL(文件名)向URL 添加带有下拉列表内容的参数(q) 添加一个随机数,以防服务器使用缓存的文件当触发事件时调用stateChanged 通过给定的URL 打开XMLHTTP 对象向服务器发送HTTP

常用数据库对比

常用数据库对比 目前,常用于OLAP分析的数据库软件有Oracle、DB2、Teradata、Greenplum、Netezza、Exdata 几种。 1、Oracle 提起数据库,第一个想到的公司,一般都会是Oracle(甲骨文)。该公司成立于1977年,最初是一家专门开发数据库的公司。Oracle在数据库领域一直处于领先地位。1984年,首先将关系数据库转到了桌面计算机上。然后,Oracle5率先推出了分布式数据库、客户/服务器结构等崭新的概念。Oracle 6首创行锁定模式以及对称多处理计算机的支持……最新的Oracle 8主要增加了对象技术,成为关系—对象数据库系统。目前,Oracle产品覆盖了大、中、小型机等几十种机型,Oracle数据库成为世界上使用最广泛的关系数据系统之一。

2、DB2 DB2是IBM公司的产品,起源于System R和System R*。他支持从PC到UNIX,从中小型机到大型机;从IBM到非IBM(HP及SUN UNIX系统等)各种操作平台。他既可以在主机上以主/从方式独立运行,也可以在客户/服务器环境中运行。其中服务平台可以是OS/400,AIX,OS/2,HP-UNIX,SUN-Solaris等操作系统,客户机平台可以是OS/2或Windows, Dos, AIX, HP-UX, SUN Solaris等操作系统。

3、Greenplum Greenplum的架构采用了MPP(大规模并行处理),公司专注于OLAP系统数据引擎开发,有世界级的研发团队进行高性能计算和数据库系统的前沿开发工作,宗旨是向客户提供高性能的超级数据引擎,并将强大的并行计算能力融入到大规模数据仓库分析领域中。公司具有发展趋势超前的视野和洞察力,为全球很多最大规模的数据仓库提供推动力;公司最先将SQL 和Map Reduce的功能整合到统一的数据处理框架中。

分区表和分区视图

分布式数据库内容 分区表和分区视图 sql Server 2000 分区视图的运用 分区视图在一个或多个服务器间水平连接一组成员表中的分区数据,使数据看起来就象来自一个表。Microsoft? SQL Server? 2000 区分本地分区视图和分布式分区视图。在本地分区视图中,所有的参与表和视图驻留在同一个 SQL Server 实例上。在分布式分区视图中,至少有一个参与表驻留在不同的(远程)服务器上。此外,SQL Server 2000 还区分可更新的分区视图和作为基础表只读复本的视图。分布式分区视图可用于实现数据库服务器联合体。联合体是一组分开管理的服务器,但它们相互协作分担系统的处理负荷。这种通过分区数据形成数据库服务器联合体的机制使您能够扩大一组服务器,以支持大型的多层 Web 站点的处理需要。有关更多信息,请参见设计联合数据库服务器。 在实现分区视图之前,必须先水平分区表。原始表被分成若干个较小的成员表。每个成员表包含与原始表相同数量的列,并且每一列具有与原始表中的相应列同样的特性(如数据类型、大小、排序规则)。如果正在创建分布式分区视图,则每个成员表分别位于不同的成员服务器上。为了获得最大程度的位置透明度,各个成员服务器上的成员数据库的名称应当是相同的,但不要求非这样。例如:Server1.CustomerDB、Server2.CustomerDB、Server3.CustomerDB。 成员表设计好后,每个表基于键值的范围存储原始表的一块水平区域。键值范围基于分区列中的数据值。每一成员表中的值范围通过分区列上的 CHECK 约束强制,并且范围之间不能重叠。例如,不能使一个表的值范围从 1 到 200000,而

创建数据库表与索引实验

实验2:创建数据库表与索引 ----表的创建与管理 1.实验目的: 掌握表和索引的建立方法及表结构的修改方法,了解表关系建立的条件和作用,并实践数据库管理系统提供的数据完整性功能,加深对数据完整性的理解。要求建立表、修改表结构、建立索引、进行数据完整性描述。 2.实验要求: ⑴在已经建立的数据库中创建表 运用Microsoft SQL Server2000企业管理器和Transact-SQL语句两种方法建立“课程信息表”、“教学任务表”、“教师档案表”、“学生档案表”、“学生选课表”、“学生成绩表”。 ⑵了解表与表之间的逻辑依赖关系 学会在Microsoft SQL Server2000企业管理器中,创建表之间的关联关系,通过外键的拖曳建立表的基本依赖关系,从而直白的表达整个数据库的表间联系,但是,注意:过程中,主键与外键对应的源数据表。 ⑶修改表结构 将学生档案表“”字段的数据类型修改为varchar(8)。为学生成绩表增减一个新的字段——“总成绩”,类型为real,默认是空值。学生成绩表“平时成绩”字段的取值为小于100的正数。 ⑷建立索引

运用Transact—SQL语句建立以下索引: ◆在学生档案表的“”字段上建立普通升序索引; ◆在学生档案表的“学号”字段上建立唯一索引; ◆在学生档案表的“学号”字段上建立聚集索引; ◆在学生档案表的“学号”(升序)、“”(升序)和“籍贯”(升序)三个字段上建立一个普通索引; ◆运用SQL企业管理器在学生档案表中的“籍贯”字段上创建普通升序索引。 3.实验环境与实验器材:计算机,网络环境,投影设备。 实验相关软件:Window xp、SQL Server 2000。 4.实验容与步骤 使用企业管理器和Transact-SQL语句创建“课程信息表”、“教学任务表”、“教师档案表”、“学生档案表”、“学生选课表”、“学生成绩表”6表,6表的具体设计容:“课程信息表”包括课程名称、课程类别、学分和学时等;“教师档案表”和“学生档案表”记录了教师和学生的基本情况;“教学任务表”包括课程ID、任课教师ID、学期和年度;“学生选课表”给出了学生与课程之间的关系;“学生成绩表”则给出了学生成绩的计算方法。 4.1 在“教学管理”数据库中使用Transact-SQL命令创建表 使用Transact-SQL命令创建“学生档案表”,包含字段“学号”、“”、“性别”、“出生日期”、“籍贯”、“专业”、“班级”。 第1步:从“开始”菜单中打开“查询分析器”,连接进入“查询”窗口。

PHP程序mysql连接文件信息修改

PHP程序MySQL文件连接信息修改 注意事项:所有路径均相对于程序的安装目录,修改信息的时候切记不要删除两边的引号 1.shopex4.8 配置文件路径: \config\config.php 配置信息 define('DB_USER', 'MYSQL登录用户'); define('DB_PASSWORD', 'MYSQL密码'); define('DB_NAME', '数据库名'); define('DB_HOST', '服务器地址'); 2.shopex4.7 配置文件路径 \include\mall_config.php 配置信息 $dbHost = "服务器地址"; $dbName = "数据库名"; $dbUser = "MYSQL登录用户名"; $dbPass = "数据库密码"; 3.discuz 配置文件路径 \config.inc.php 配置信息 $dbhost = '服务器地址'; // 数据库服务器 $dbuser = '数据库名'; // 数据库用户名 $dbpw = '数据库密码'; // 数据库密码 $dbname = '数据库名'; // 数据库名 4. phpwind 配置文件路径 \data\sql_config.php 配置文件信息 define('DB_USER', '数据库用户'); define('DB_PASSWORD', '数据库密码'); define('DB_NAME', '数据库名'); define('DB_HOST', '数据库地址'); 5.PHPCMS 配置文件路径 \config.inc.php 配置文件信息 $CONFIG['dbhost'] = '数据库主机'; $CONFIG['dbuser'] = '数据库用户名';

SQLserver创建分区表

如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了。 1、数据库中某个表中的数据很多。很多是什么概念?一万条?两万条?还是十万条、一百万条?这个,我觉得是仁者见仁、智者见智的问题。当然数据表中的数据多到查询时明显感觉到数据很慢了,那么,你就可以考虑使用分区表了。如果非要我说一个数值的话,我认为是1亿条。 2、但是,数据多了并不是创建分区表的惟一条件,哪怕你有一千万条记录,但是这一千万条记录都是常用的记录,那么最好也不要使用分区表,说不定会得不偿失。只有你的数据是分段的数据,那么才要考虑到是否需要使用分区表。 3、什么叫数据是分段的?这个说法虽然很不专业,但很好理解。比如说,你的数据是以年为分隔的,对于今年的数据而言,你常进行的操作是添加、修改、删除和查询,而对于往年的数据而言,你几乎不需要操作,或者你的操作往往只限于查询,那么恭喜你,你可以使用分区表。换名话说,你对数据的操作往往只涉及到一部分数据而不是所有数据的话,那么你就可以考虑什么分区表了。 那么,什么是分区表呢? 简单一点说,分区表就是将一个大表分成若干个小表。假设,你有一个销售记录表,记录着每个每个商场的销售情况,那么你就可以把这个销售记录表按时间分成几个小表,例如说5个小表吧。2009年以前的记录使用一个表,2010年的记录使用一个表,2011年的记录使用一个表,2012年的记录使用一个表,2012年以后的记录使用一个表。那么,你想查询哪个年份的记录,就可以去相对应的表里查询,由于每个表中的记录数少了,查询起来时间自然也会减少。 但将一个大表分成几个小表的处理方式,会给程序员增加编程上的难度。以添加记录为例,以上5个表是独立的5个表,在不同时间添加记录的时候,程序员要使用不同的SQL 语句,例如在2011年添加记录时,程序员要将记录添加到2011年那个表里;在2012年添加记录时,程序员要将记录添加到2012年的那个表里。这样,程序员的工作量会增加,出错的可能性也会增加。 使用分区表就可以很好的解决以上问题。分区表可以从物理上将一个大表分成几个小表,但是从逻辑上来看,还是一个大表。 接着上面的例子,分区表可以将一个销售记录表分成五个物理上的小表,但是对于程序员而言,他所面对的依然是一个大表,无论是2010年添加记录还是2012年添加记录,对于程序员而言是不需要考虑的,他只要将记录插入到销售记录表——这个逻辑中的大表里就行了。SQL Server会自动地将它放在它应该呆在的那个物理上的小表里。 同样,对于查询而言,程序员也只需要设置好查询条件,OK,SQL Server会自动将去相应的表里查询,不用管太多事了。

数据库对比方案

开放性: SQL Server 只能在windows 上运行,没有丝毫的开放性,操作系统的系统的稳定对数据库是十分重要的。Windows9X系列产品是偏重于桌面应用,NT server只适合中小型企业。而且windows平台的可靠性,安全性和伸缩性是非常有限的。它不象unix那样久经考验,尤其是在处理大数据量的关键业务时。 Oracle 能在所有主流平台上运行(包括 windows)。完全支持所有的工业标准。采用完全开放策略。可以使客户选择最适合的解决方案。对开发商全力支持。 DB2 能在所有主流平台上运行(包括windows)。最适于海量数据。DB2在企业级的应用最为广泛,在全球的500家最大的企业中,几乎85%以上用DB2数据库服务器,而国内到97年约占5%。 可伸缩性,并行性 SQL server。 并行实施和共存模型并不成熟。很难处理日益增多的用户数和数据卷。伸缩性有限。 Oracle 平行服务器通过使一组结点共享同一簇中的工作来扩展windownt

的能力,提供高可用性和高伸缩性的簇的解决方案。 如果windowsNT不能满足需要, 用户可以把数据库移到UNIX中。DB2 DB2具有很好的并行性。DB2把数据库管理扩充到了并行的、多节点的环境. 数据库分区是数据库的一部分,包含自己的数据、索引、配置文件、和事务日 志。数据库分区有时被称为节点或数据库节点 安全性 SQL server 没有获得任何安全证书。 Oracle Server 获得最高认证级别的ISO标准认证。 DB2 获得最高认证级别的ISO标准认证。 性能 SQL Server 多用户时性能不佳 Oracle 性能最高,保持windowsNT下的TPC-D和TPC-C的世界记录。

MySQL自动分区扩展

MySQL实现定时建立删除分区 来源:中国自学编程网发布日期:2008-09-29 最近需要把一个oralce数据库向mysql数据库移植。oracle库用到了job和存储过程,因为mysql中没有job,所有要用新功能event代替一下,这个是5.1以后才有的新功能,所以稍微研究了一下。 原来需要实现的功能是每间隔一段时间就会建立几个分区,并删除几个分区,以保持数据库只存一段时间内的数据,以下是实现步骤 1)首先我们建立表,这个时候就遇到了一点问题,因为mysql PARTITION BY RANGE 的时候只支持按数字类型进行分区,所以不支持直接用date类型分区,而且有很多函数不能在PARTITION BY RANGE 中使用,所以我使用了到公元元年的描述作为划分分区的依据 CREATE TABLE `data_table` ( `dtime` datetime NOT NULL, `alarm_no` int(8) NOT NULL, `alarm_level` int(1) NOT NULL, `color_index` int(1) NOT NULL, `server_name` varchar(64) NOT NULL, `process_name` varchar(64) NOT NULL, `desciption` varchar(600) NOT NULL ) ENGINE=MyISAM DEFAULT CHARSET=gb2312 /*!50100 PARTITION BY RANGE (TO_DAYS(dtime)*24*60*60+TIME_TO_SEC(dtime)) (PARTITION p0 VALUES LESS THAN (0) ENGINE = MyISAM) */; 2)然后我们建立存储过程 这里是添加表部分的实现,第2个存储过程调用第一个存储过程,control表中存的是一些参数,值得注意的时,因为有可能插入重复的分区,所有我们进行了异常处理,如果出现重复分区异常我们会跳过这次循环继续 delimiter // CREATE PROCEDURE `gen_partion_script_proc`(spec_date DATETIME, table_name VARCHAR(64), table_space VARCHAR(64), prefix VARCHAR(64), key_type INTEGER(10), qty_day INTEGER(10)) NOT DETERMINISTIC SQL SECURITY DEFINER COMMENT '' begin

实验八 PHP与Mysql数据库交互实验

实验八 PHP与Mysql数据库交互实验 一、实验目的 1.掌握PHP连接MySql数据库的方法; 2.掌握PHP操作MySql数据库的方法; 3.理解PHP操作MySql数据库的流程。 二、实验方法 通过实验,学生可以做到: 1.使用PHP连接MySql数据库。 2.使用PHP对MySql数据库进行插入、删除、查询操作。 3.制作简单的动态交互网页。 三、实验过程 (一)创建数据库和数据表 1.利用phpMyAdmin在图形界面下创建数据库和数据表 在地址栏输入http://localhost:8080/phpmyadmin/,在弹出的窗口的用户栏内输入“root”,密码栏内输入安装时预留的密码,显示如下页面则表明登录成功。 在左侧选择数据库“test”(如果没有,则创建之),并向其中添加“学生信息”表(studentInfo),表中添加字段“姓名、年龄、性别、住址、专业”等。 如果操作正确,显示下图则表明数据表创建成功,下面可以向表中添加数据。 2.向表中添加内容 选择要进行操作的数据表(studentInfo),然后单击“插入”即可进行数据的插入操作。

此处插入数据的操作不是很方便,是逐字段进行的。 测试数据请学生自行编写,至少插入十条不同的数据,以便后续使用。 (二)使用PHP 操作MySql 数据库 1.PHP 连接Mysql 数据库服务器 在网站根目录下新建文件conn.php ,用于连接Mysql 数据库。如果连接成功,给出“已经成功连接MySQL 数据库”的信息,否则,给出“不能连接到MySQL 数据库”的信息。示例代码如下: 在浏览器地址栏输入:http://localhost :端口号/conn.php ,回车,显示如图2所示,则表明PHP 与MySQL 能够协同工作了。 2.PHP 选择要使用的数据库 建立数据库链接后,需要使用mysql_select_db()函数,来指定一个数据库,本例为刚刚创建的test 数据库。下面演示mysql_select_db()函数的使用方法,示例代码如下。

oracle大表分区

摘要:本篇文章介绍了ORACLE数据库的新特性—分区管理,并用例子说明使用方法。 关键词:ORACLE,分区 一、分区概述: 为了简化数据库大表的管理,ORACLE8推出了分区选项。分区将表分离在若干不同的表空间上,用分而治之的方法来支撑无限膨胀的大表,给大表在物理一级的可管理性。将大表分割成较小的分区可以改善表的维护、备份、恢复、事务及查询性能。针对当前社保及电信行业的大量日常业务数据,可以推荐使用ORACLE8的该选项。 二、分区的优点: 1 、增强可用性:如果表的一个分区由于系统故障而不能使用,表的其余好的分区仍然可以使用; 2 、减少关闭时间:如果系统故障只影响表的一部分分区,那么只有这部分分区需要修复,故能比整个大表修复花的时间更少; 3 、维护轻松:如果需要重建表,独立管理每个分区比管理单个大表要轻松得多; 4 、均衡I/O:可以把表的不同分区分配到不同的磁盘来平衡I/O改善性能;

5 、改善性能:对大表的查询、增加、修改等操作可以分解到表的不同分区来并行执行,可使运行速度更快; 6 、分区对用户透明,最终用户感觉不到分区的存在。 三、分区的管理: 1 、分区表的建立: 某公司的每年产生巨大的销售记录,DBA向公司建议每季度的数据放在一个分区内,以下示范的是该公司1999年的数据(假设每月产生30M的数据),操作如下: STEP1、建立表的各个分区的表空间: CREATE TABLESPACE ts_sale1999q1 DATAFILE ‘/u1/oradata/sales/sales1999_q1.dat’ SIZE 100M DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0) CREATE TABLESPACE ts_sale1999q2 DATAFILE ‘/u1/oradata/sales/sales1999_q2.dat’ SIZE 100M DEFAULT STORAGE (INITIAL 30m NEXT 30m MINEXTENTS 3 PCTINCREASE 0)

sql_server数据库分区表创建和修改实例

-----------------------------建立分区表------------------------------- --建数据库 create database Tmp_db on ( name= Tmp_db_dat, filename='D:\Date\Tmp_db.mdf', size= 10, maxsize= 50, filegrowth= 5 ) log on ( name= Tmp_db_log, filename='D:\Date\Tmp_db.ldf', size= 5, maxsize= 25, filegrowth= 5 ) go use Tmp_db go --增加文件组 alter database Tmp_db add filegroup f1 alter database Tmp_db add filegroup f2 alter database Tmp_db add filegroup f3 alter database Tmp_db add filegroup f4 --将文件分配到文件组 alter database Tmp_db add file(name= N'Tmp_db_f1',filename= N'D:\Date\Tmp_db_f1.ndf',size=3072kb,filegrowth=1024kb) to filegroup f1 alter database Tmp_db add file(name= N'Tmp_db_f2',filename= N'D:\Date\Tmp_db_f2.ndf',size=3072kb,filegrowth=1024kb) to filegroup f2 alter database Tmp_db add file(name= N'Tmp_db_f3',filename= N'D:\Date\Tmp_db_f3.ndf',size=3072kb,filegrowth=1024kb) to filegroup f3 alter database Tmp_db add file(name= N'Tmp_db_f4',filename= N'D:\Date\Tmp_db_f4.ndf',size=3072kb,filegrowth=1024kb) to filegroup f4 --创建分区函数 create partition function pt_fn_test(int)

数据库的创建与表间关系的各种操作

学科实验报告 班级2010级金融姓名陈光伟学科管理系统中计算机应用实验名称数据库的创建与表间关系的各种操作 实验工具Visual foxpro 6.0 实验目的1、掌握数据库结构的创建方式 2、表间的关联关系 实验步骤一、建立数据库。 1、在项目管理器中建立数据库。首先选择数据库,然后单击“新建”建立数据库,出现的界面提示用户输入数据库的名称,按要求输入后单击“保存”则完成数据库的建立,并打开i“数据库设计器”。 2、从“新建”对话框建立数据库。单击工具栏上的“新建”按钮或者选择菜单“文件——新建”打开“新建”对话框,首先在“文件类型”组框中选择“数据库”,然后单击“新建文件”建立数据库,后面的操作和步骤与1相同。 3、用命令交互建立数据库。命令是create database【databasename ▏?】 二、表间关系的各种操作。 1、创建索引文件。可以再创建数据表时建立其结构复合索引文件,但是也可以先建立好数据表,以后再创建或修改索引文件。 2、索引的操作。A、打开与关闭。要使用索引,必须先要打开索引。一旦数据表文件关闭所有相应的索引文件也就自动关闭了。B、确定主控索引。可以使用命令确定当前主控索引。命令格式1:set order to 【tag】<索引标识>【ascending| desceding】命令格式2:use<表文件名>order【tag】<索引标识>【ascending | esceding】C、删除索引标识。要删除结构复合索引文件中的索引标识,应当打开数据表文件,并打开其表设计器对话框。在“索引”页面中选定要删除的索引标识后,单击“删除”按钮删除。 3、创建关联。在创建数据表之间的关联时,把当前数据表叫做父表,而把要关联的表叫做子表。必须保证两个要建立关系的数据表中存在能够建立联系的同类字段;同时要求每个数据表事先分别以该字段建立了索引。A、建立表间的一对一的关系。在“数据库设计器”窗口中选择M表中的字段,并按住左键拖到关联表H中对应字段上,放开鼠标左键。这是可以看到在两个表之间的相关字段上产生了一条连线,表明两个表之间已经建立了“一对一”关系。B、建立表间一对多的关系。将M表的名称字段MC设定为主索引,或者候选索引;H表中的JG字段已经设置成普通索引。在“数据库设计器”窗口中将MC字段拖到关联表中对应字段JG上,放开鼠标左键。这时可以看到在两个表之间的相关字段上产生了一条显然与“一对一”关联不同形式的连线,表明两个表之间已经建立了“一对多”关系。 4、调整或删除关联。A、删除关联。在数据库设计器对话框窗口中,首先必须用鼠标左键单击关联线,该连线变粗了说明它已被选中。如果要删除可敲【del】。也可以单击鼠标右键在弹出对话框窗口中单击“删除关联”选项。B、编辑关联。在数据库设计器对话框窗口中,首先必须用鼠标左键单击关联线,该连线变粗了说明已被选中。在主菜单“数据库”选项的下拉菜单中的“编辑关系”选项,也可以单击鼠标右键在弹出对话框窗口中单击“编辑关系”选项。 5、设置数据表之间的参照完整性。在对数据库表建立关联关系后,就可以设置两个相关数据表之间操作的有效性原则。这些规则可以控制相关表中的记录的插入、删除或修改。

php页面连接数据库与跳转

PHP连接MYSQL数据库代码 -------------------------------------------------------------------------------- -------------------------------------------------------------------------------- PHP连接ACCESS数据库代码方法 -------------------------------------------------------------------------------- Open($connstr); $rs = new com("ADODB.RecordSet"); $rs->Open("select * from szd_t",$conn,1,1); while(! $rs->eof) { $f = $rs->Fields(1); echo $f->value; $rs->MoveNext(); } ?> --------------------------------------------------------------------------------

表空间及分区表的概念

1. 表空间及分区表的概念 表空间:是一个或多个数据文件的集合,所有的数据对象都存放在指定的表空间中,但主要存放的是表,所以称作表空间。 分区表:当表中的数据量不断增大,查询数据的速度就会变慢,应用程序的性能就会下降,这时就应该考虑对表进行分区。表进行分区后,逻辑上表仍然是一张完整的表,只是将表中的数据在物理上存放到多个“表空间”(物理文件上),这样查询数据时,不至于每次都扫描整张表而只是从当前的分区查到所要的数据大大提高了数据查询的速度。 2. 表分区的具体作用 ORACLE的表分区功能通过改善可管理性、性能和可用性,从而为各式应用程序带来了极大的好处。通常,分区可以使某些查询以及维护操作的性能大大提高。此外,分区还可以极大简化常见的管理任务,分区是构建千兆字节数据系统或超高可用性系统的关键工具。分区功能能够将表、索引或索引组织表进一步细分为段,这些数据库对象的段叫做分区。每个分区有自己的名称,还可以选择自己的存储特性。从数据库管理员的角度来看,一个分区后的对象具有多个段,这些段既可进行集体管理,也可单独管理,这就使数据库管理员在管理分区后的对象时有相当大的灵活性。但是,从应用程序的角度来看,分区后的表与非分区表完全相同,使用SQL DML 命令访问分区后的表时,无需任何修改。 什么时候使用分区表: 1. 表的大小超过2GB。 2. 表中包含历史数据,新的数据被增加到新的分区中。 3. 表分区的优缺点 表分区有以下优点: 1)改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索速 度。 2)增强可用性:如果表的某个分区出现故障,表在其他分区的数据仍然可用; 3)维护方便:如果表的某个分区出现故障,需要修复数据,只修复该分区即可; 4)均衡I/O:可以把不同的分区映射到不同磁盘以平衡I/O,改善整个系统性能。缺点:

在db2上建立数据库分区的步骤和命令

本文简单介绍了在DB2上建立数据库分区的步骤和涉及到的命令等,供大家参考! AD:创建database partition 1、创建需要建立数据库分区的db instance 可使用命令建立db instance: db2icrt -s ESE -u db2admin,aaa123456 -h ANWENHAO DBINSTANCENAME 创建完成对应的instance 后需要重启DB2。 2、将新建的db instance加入到DB2中: CATALOG LOCAL NODE DB2INST1 INSTANCE DB2INST1 SYSTEM ANWENHAO OSTYPE NT; 3、在命令行中设置当前需要操作的dbInstance。 set db2instance=db2inst1 db2 get instance

db2 attach to db2inst1 4、创建DBPartition db2start dbpartitionnum 1 ADD DBPARTITIONNUM HOSTNAME ANWENHAO PORT 1 COMPUTER ANWENHAO USER db2admin PASSWORD aaa123456 WITHOUT TABLESPACES 5、创建完成后需要重新启动db2。DB2在此时会增加一个database partition并进行redistribution。 以上操作即完成database partition。 创建database partition group CREATE DATABASE PARTITION GROUP "NODE1" ON DBPARTITIONNUMS (1); COMMENT ON DATABASE PARTITION GROUP "NODE1" IS 'ANWENHAO _1';

sqlserver2005+创建分区表+分区索引+注意事宜+分区索引

、分区索引 1. 分区表简介 使用分区表的主要目的,是为了改善大型表以及具有各种访问模式的表的可伸缩性和可管理性。 大型表:数据量巨大的表。? ?访问模式:因目的不同,需访问的不同的数据行集,每种目的的访问可以称之为一种访问模式。 分区一方面可以将数据分为更小、更易管理的部分,为提高性能起到一定的作用;另一方面,对于如果具有多个CPU的系统,分区可以是对表的操作通过并行的方式进行,这对于提升性能是非常有帮助的。 注意:只能在SQL Server Enterprise Edition 中创建分区函数。只有SQL Server Enterprise Edition 支 持分区。 2. 创建分区表或分区索引的步骤 可以分为以下步骤: 1. 确定分区列和分区数 2. 确定是否使用多个文件组 3. 创建分区函数 4. 创建分区架构(Schema) 5. 创建分区表 6. 创建分区索引 下面详细描述的创建分区表、分区索引的步骤。 2.1. 确定分区列和分区数 在开始做分区操作之前,首先要确定待分区表的访问模式,该模式决定了什么列适合做分区键。例如,对于销售数据,一般会先根据日期把数据范围限定在一个范围内,然后在这个基础上做进一步的查询,这样, 就可以把日期作为分区列。 确定了分区列之后,需要进一步确定分区数,亦即分区表中需要包含多少数据,每个分区的数据应该限定 在哪个范围。 2.2. 确定是否使用多个文件组 为了有助于优化性能和维护,应该使用文件组分离数据。一般情况下,如果经常对分区的整个数据集操作,则文件组数最好与分区数相同,并且这些文件组通常应该位于不同的磁盘上,再配合多个CPU,则SQL Server 可以并行处理多个分区,从而大大缩短处理大量复杂报表和分析的总体时间。 2.3. 创建分区函数 分区函数用于定义分区的边界条件,创建分区函数的语法如下: CREATE PARTITION FUNCTION partition_function_name ( input_parameter_type ) AS RANGE [ LEFT | RIGHT ] FOR VALUES ( [ boundary_value [ ,...n ] ] ) [ ; ] 参数说明: ?partition_function_name

MYSQL分区表测试

MYSQL分区表测试 MYSQL分区表测试 一、mysql分区简介 数据库分区 数据库分区是一种物理数据库设计技术。虽然分区技术可以实现很多效果,但其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减sql语句的响应时间,同时对于应用来说分区完全是透明的。 MYSQL的分区主要有两种形式:水平分区和垂直分区 水平分区(Horizontal Partitioning) 这种形式的分区是对根据表的行进行分区,通过这样的方式不同分组里面的物理列分割的数据集得以组合,从而进行个体分割(单分区)或集体分割(1个或多个分区)。 所有在表中定义的列在每个数据集中都能找到,所以表的特性依然得以保持。水平分区一定要通过某个属性列来分割。常见的比如年份,日期等。 垂直分区(Vertical Partitioning) 这种分区方式一般来说是通过对表的垂直划分来减少目标表的宽度,使某些特定的列被划分到特定的分区,每个分区

都包含了其中的列所对应所有行。 可以用show variables like '%partition%'; 命令查询当前的mysql数据库版本是否支持分区。 分区的作用:数据库性能的提升和简化数据管理 在扫描操作中,mysql优化器只扫描保护数据的那个分区以减少扫描范围获得性能的提高。 分区技术使得数据管理变得简单,删除某个分区不会对另外的分区造成影响,分区有系统直接管理不用手工干预。mysql从5.1版本开始支持分区。每个分区的名称是不区分大小写。同个表中的分区表名称要唯一。 二、mysql分区类型 根据所使用的不同分区规则可以分成几大分区类型。RANGE 分区: 基于属于一个给定连续区间的列值,把多行分配给分区。LIST 分区: 类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进行选择。 HASH分区: 基于用户定义的表达式的返回值来进行选择的分区,该表达式使用将要插入到表中的这些行的列值进行计算。这个函数可以包含MySQL中有效的、产生非负整数值的任何表达式。KEY

相关主题
文本预览
相关文档 最新文档