MySQLCluster5.1 的一个最受期待的特性是集群已支持基于磁盘的数据存
MySQL Cluster 5.1的一个最受期待的特性是集群已支持基于磁盘的数据存取。NDB存储引擎大大增强了MySQL Cluster的性能,该引擎之前是一个100%的内存数据库引擎。这种引擎对可以运行在内存里的数据库来说是极好的选择,现在基于磁盘的存取数据支持使MySQL 5.1集群拓展了数据库规模,使MySQL集群用户有能力创建更大的数据库而且能对其有效的管理。
对于必须具备很高可用性,但不苛求像基于内存数据存储那样的高性能特性的数据,利用磁盘存取的方式将是最好的选择。另外,那些由于操作系统或硬件条件所致的硬性局限,可以考虑移植基于内存存取的库到磁盘存取的库当中,或者在支持磁盘存取数据的MySQL Cluster上开发新的应用。
本文主要关注MySQL Cluster中创建、移植和维护基于磁盘存取的数据表。请切记对基于磁盘存取数据的支持已经在5.1.6bata 版中正式推出。
1. 概念
MySQL Cluster采用一系列的Disk Data objects来实现磁盘表。
Tablespaces:作用是作为其他Disk Data objects的容器。
Undo log files:存储事务进行回滚需要的信息,一个或者多个undo log files组成一个log files group,最后,该log file group关联到一个tablespaces。
Data files:作用是存储表中的数据,data file直接关联到tablespaces。
在每一个数据节点上undo log files和data files都是实际的文件,默认的,存放在ndb_node_id_fs文件夹下,该路径是在MySQL Cluster的config.ini中用DataDir指定的,node_id是data node的node ID。可以用绝对路径或者相对路径指定undo log或者data file的路径。tablespaces和log file group则不是实际的文件。
2. 创建步骤
MySQL Cluster创建一个磁盘表需要包含以下几步:
1、创建一个log file group,将一个或者多个undo log files关联到它上面(undo log file也叫做 undofile)。注意,undo log file只是在创建磁盘表的时候才需要,创建ndb的内存表的时候不需要。
2、创建一个tablespaces,关联一个log file group和一个或者多个data files到上面。
3、使用该tablespaces创建一个磁盘表存储数据。
下面做一个例子,创建一个基于内存存取的表
通常创建NDB表的时候,只要发出如下的语句,表和索引都会在主存里建立起来,并且已处于就绪状态。
CREATE TABLE table1 ( col1 int, col2 int, col3 int, col4 int, PRIMARY KEY(col1), index(col1,col2)) ENGINE=ndb;
上面语句所建表的属性如下:
col1 和col2 列驻留内存,因为它们是索引的一部分,这一点即使在使用基于磁盘的存储的MySQL 5.1里面也有同样的限制,原因是NDB索引仍然必须全部驻留于内存里。
Col3列和col4列也驻留于内存,不过我们在5.1里面可以改成磁盘存储,通过在MySQL Cluster定义一个表空间,然后把这些列指向表空间实现。
创建一个日志文件组和表空间
如前所述,利用MySQL Cluster的磁盘数据存取新特性时,我们首先进行一些初始步骤准备。这些步骤包括创建日志文件组和表空间。
创建日志文件组时会在每个数据节点上为存储UNDO日志而新建一个文件。(请注意在5.1版中,只能支持一个logfile 组,然而,从理论上讲,以后一个无限制undofiles数量的特性将被支持的。Undo缓冲区的缺省值是8MB。)
CREATE LOGFILE GROUP logfg1 ADD UNDOFILE 'undofile1.dat' INITIAL_SIZE 16M UNDO_BUFFER_SIZE = 1M ENGINE=ndb;
该语句可能会出错,出现ERROR 1064 (42000)语法错误的信息,原因是字符集的问题,先执行set character_set_client=latin1,在执行创建LOGFILE语句。
接下来我们将在每个数据节点上创建一个文件来存储基于磁盘存取表的分区。我们在表空间里面建的表都与一个logfile 组相关联。
CREATE TABLESPACE tsp1 ADD DATAFILE 'datafile1.dat' USE LOGFILE GROUP logfg1 INITIAL_SIZE 12M ENGINE=ndb;
由于我们已经创建了logfile组和表空间,现在就可以创建第一个基于磁盘存取的表了。
CREATE TABLE table3 ( pk_col1 int, fname_col2 VARCHAR(24), lname_col3 VARCHAR(255), ssno_col4 int , PRIMARY KEY (pk_col1), INDEX (pk_col1, ssno_col4)) TABLESPACE tsp1 STORAGE DISK ENGINE=ndb;
上面所建表的属性如下:
pk_col1列和ssnp_col4列被保存到内存,因为它们是索引的一部分,这一点前面已有所述,这是源于整个5.1版本MySQL其索引必须存于内存中。
fname_col2列和lname_col3列不属于索引,将被保存到磁盘上。
3. 磁盘数据管理与维护
如果以后某一时候需要给表空间增加数据文件,我们可以用下面的命令完成:
ALTER TABLESPACE tsp1 ADD DATAFILE 'datafile2.dat' INITIAL_SIZE 16M ENGINE=ndb;
添加另一个undofile到logfile组可以通过下面的方法来做:
ALTER LOGFILE GROUP logfg1 ADD UNDOFILE 'undofile2.dat' INITIAL_SIZE 16M ENGINE=ndb;
你也可以给在磁盘上建好的表添加一个索引,具体过程如下:
CREATE TABLE table3 ( col1 int, col2 int, col3 int, col4 int, PRIMARY KEY (col1)) TABLESPACE tsp1 STORAGE DISK ENGINE=ndb; ALTER TABLE table3 ADD INDEX col1and2_index (col1, col2), ENGINE=ndb;
这两步操作将创建适当的索引,并将相应的索引列移到内存,而把其他的,列存于磁盘上。
可以在INFORMATION_SCHEMA数据库中的FILES表中查看磁盘表的信息。
SELECT TABLE_NAME, `ENGINE`, TABLE_ROWS, AVG_ROW_LENGTH, DATA_LENGTH, MAX_DATA_LENGTH, INDEX_LENGTH, DATA_FREE FROM TABLES WHERE TABLE_NAME LIKE 'disktabl%';
从上面的截图中看出,测试用了两张表,一张是diskTableInDisk表,存储数据在磁盘上,一张是diskTableInMemory表,存数数据在内存中,两张表的结构完全一样,只是表名称不一样,向两张表中插入8000条相同的数据,内存表占用了大约3.2M的内存空间,磁盘表占用了大约1.5M的内存空间,但是磁盘表还占用了20多兆的磁盘空间。磁盘数据表占用磁盘空间大。
关于表空间和logfile组方面需要注意的是,在表空间和logfile组被删除之前,必须先删除表空间和logfile组中的对象。否则将产生与下面相似的结果:
DROP TABLESPACE tsp1 ENGINE=ndb; ERROR 1507 (HY000): Failed to drop TABLESPACE DROP LOGFILE GROUP logfg1 ENGINE=ndb; ERROR 1507 (HY000): Failed to drop LOGFILE GROUP
对基于磁盘的集群结构的管理可以简要概括如下:
1、如果相依赖的表空间存在则logfile组不能被删除
2、如果相依赖的数据文件存在则表空间不能被删除
3、如果表空间中相依赖的表存在,则相应的数据文件就不能从表空间中删除。
因此,在开始上述维护操作之前,我们必须先使用如下命令删除数据表。
DROP TABLE table3;
然后删除和表空间相关联的数据文件。
ALTER TABLESPACE tsp1 DROP DATAFILE 'datafile1.dat' ENGINE=ndb; ALTER TABLESPACE tsp1 DROP DATAFILE 'datafile2.dat' ENGINE=ndb;
最后删除表空间和logfile组
DROP TABLESPACE tsp1 ENGINE=ndb; DROP LOGFILE GROUP logfg1 ENGINE=ndb;
4. 移植内存表到磁盘表
现在我们来看怎么移植一个内存表到一个磁盘表,首先,我们先创建一个简单的内存表:
CREATE TABLE table4 ( col1 int(5), col2 int(5), col3 int(5), col4 int(5), PRIMARY KEY(col1), INDEX(col1,col2)) ENGINE=ndb;
所建表的属性如下:
col1和col2列由于是索引,被保存到内存。
col3和col4列因为没有定义与之对应的表空间,因此也被保存于内存中。
如前所述,存于磁盘的数据需要有一个表空间和logfile组,因而先来创建这两项:
CREATE LOGFILE GROUP logfg1 ADD UNDOFILE 'undofile1.dat' INITIAL_SIZE 16M UNDO_BUFFER_SIZE = 1M ENGINE=ndb; CREATE TABLESPACE tsp1 ADD DATAFILE 'datafile1.dat' USE LOGFILE GROUP logfg1 INITIAL_SIZE 12M ENGINE ndb;
现在,执行下面的ALTER命令来移植内存表到利用上面定义的表空间的磁盘表。
ALTER TABLE table4 TABLESPACE tsp1 STORAGE DISK ENGINE=ndb;
移植后的表属性如下:
col1和col2列被保存于内存中,因为他们仍是索引的一部分。
col3和col4列将被保存到磁盘,因为他们不属于索引。
参数
以下是当使用基于磁盘的数据时,你应该添加到集群配置文件config.ini的NDBD部分的一些参数。
DiskPageBufferMemory= X
这个参数定义磁盘数据页缓存大小,每一页分配32K bytes。
SharedPoolMemory= X
这个参数设定能被各种资源所使用的空间大小,目前使用共享池的对象包括:表空间、logfile组、数据文件、undo文件、分区信息、log buffer waiter、log sync waiter、页请求、undo 缓冲。
5. 磁盘数据存取的注意点
1) 磁盘数据表的变长列将占用固定空间,对于每行来说,也就是占用最大空间。
2) 在磁盘数据表中,TEXT和BLOB的前256个字节存于内存,其他的存放在磁盘上。
3) 磁盘数据表的每一行要在内存里面存放8个字节,以指向存放在磁盘上的数据。所以如果一行要存放在磁盘上数据少于8个字节,还不如都放在内存里。
4) 数据节点重启时--initial选项并不移除磁盘数据文件,你得手工事先把他们干掉。
5) 在每个CREATE LOGFILE GROUP、 ALTER LOGFILE GROUP、CREATE TABLESPACE or ALTER TABLESPACE 语句里面都必须加上一个ENGINE字段,ENGINE的值可以为NDB 和NDBCLUSTER。
参考
http://wenku.baidu.com/link?url=be8N19vKcJG6tNpPy96v5G2CoiLwKnu8Bmzz2-0xUEyPXTTJP1eVJPj6hVSVrJ6UN3m61i1WZLjNJwvfHoi7kQS9uT63gI7Q9Vbl2BnRYUi
http://www.jb51.net/article/31874.htm
http://blog.csdn.net/mchdba/article/details/10544585
http://blog.csdn.net/chenxingzhen001/article/details/7592100

MySQL索引基数对查询性能有显着影响:1.高基数索引能更有效地缩小数据范围,提高查询效率;2.低基数索引可能导致全表扫描,降低查询性能;3.在联合索引中,应将高基数列放在前面以优化查询。

MySQL学习路径包括基础知识、核心概念、使用示例和优化技巧。1)了解表、行、列、SQL查询等基础概念。2)学习MySQL的定义、工作原理和优势。3)掌握基本CRUD操作和高级用法,如索引和存储过程。4)熟悉常见错误调试和性能优化建议,如合理使用索引和优化查询。通过这些步骤,你将全面掌握MySQL的使用和优化。

MySQL在现实世界的应用包括基础数据库设计和复杂查询优化。1)基本用法:用于存储和管理用户数据,如插入、查询、更新和删除用户信息。2)高级用法:处理复杂业务逻辑,如电子商务平台的订单和库存管理。3)性能优化:通过合理使用索引、分区表和查询缓存来提升性能。

MySQL中的SQL命令可以分为DDL、DML、DQL、DCL等类别,用于创建、修改、删除数据库和表,插入、更新、删除数据,以及执行复杂的查询操作。1.基本用法包括CREATETABLE创建表、INSERTINTO插入数据和SELECT查询数据。2.高级用法涉及JOIN进行表联接、子查询和GROUPBY进行数据聚合。3.常见错误如语法错误、数据类型不匹配和权限问题可以通过语法检查、数据类型转换和权限管理来调试。4.性能优化建议包括使用索引、避免全表扫描、优化JOIN操作和使用事务来保证数据一致性

InnoDB通过undolog实现原子性,通过锁机制和MVCC实现一致性和隔离性,通过redolog实现持久性。1)原子性:使用undolog记录原始数据,确保事务可回滚。2)一致性:通过行级锁和MVCC确保数据一致。3)隔离性:支持多种隔离级别,默认使用REPEATABLEREAD。4)持久性:使用redolog记录修改,确保数据持久保存。

MySQL在数据库和编程中的地位非常重要,它是一个开源的关系型数据库管理系统,广泛应用于各种应用场景。1)MySQL提供高效的数据存储、组织和检索功能,支持Web、移动和企业级系统。2)它使用客户端-服务器架构,支持多种存储引擎和索引优化。3)基本用法包括创建表和插入数据,高级用法涉及多表JOIN和复杂查询。4)常见问题如SQL语法错误和性能问题可以通过EXPLAIN命令和慢查询日志调试。5)性能优化方法包括合理使用索引、优化查询和使用缓存,最佳实践包括使用事务和PreparedStatemen

MySQL适合小型和大型企业。1)小型企业可使用MySQL进行基本数据管理,如存储客户信息。2)大型企业可利用MySQL处理海量数据和复杂业务逻辑,优化查询性能和事务处理。

InnoDB通过Next-KeyLocking机制有效防止幻读。1)Next-KeyLocking结合行锁和间隙锁,锁定记录及其间隙,防止新记录插入。2)在实际应用中,通过优化查询和调整隔离级别,可以减少锁竞争,提高并发性能。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

SublimeText3 Linux新版
SublimeText3 Linux最新版

Atom编辑器mac版下载
最流行的的开源编辑器

MinGW - 适用于 Windows 的极简 GNU
这个项目正在迁移到osdn.net/projects/mingw的过程中,你可以继续在那里关注我们。MinGW:GNU编译器集合(GCC)的本地Windows移植版本,可自由分发的导入库和用于构建本地Windows应用程序的头文件;包括对MSVC运行时的扩展,以支持C99功能。MinGW的所有软件都可以在64位Windows平台上运行。

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)