- 浏览: 188065 次
- 性别:
- 来自: 北京
文章分类
最新评论
-
grzrt:
zkf55915 写道哥们怎么用啊
好久不用了,就是看帮助资 ...
淘宝MetaQ开源消息队列安装 -
zkf55915:
哥们怎么用啊
淘宝MetaQ开源消息队列安装 -
grzrt:
jinnianshilongnian 写道整这个了?
没有 看 ...
linux内核中链表的实现 -
jinnianshilongnian:
整这个了?
linux内核中链表的实现
本文总结个这段时间研究MySQL水平分区表总结,列举分区表的相关操作和通过实际数据对分区表读写的性能比较.
在网上看了很多文章,都太过于概念,注意集中在介绍分区表的优点,而不注重时间操作,跟大学教授论文似的,唯一由于的一片文章和大家分享一下吧http://fanqiang.chinaunix.net/db/mysql/2006-05-08/4135.shtml.
MySQL分区表操作代码(本案例按月分区):
1. 创建分区表:
CREATE TABLE `表名` (
`EQUIPMENTID`char(17) NOT NULL,
`ATTRIBUTEID`char(4) NOT NULL,
`VALUE`varchar(20) NOT NULL,
`COLLECTTIME`datetime NOT NULL
) ENGINE=InnoDB(适用大部分引擎,可根据需要调整) DEFAULT CHARSET=latin1
PARTITION BY RANGE(to_days(`时间字段名`))
(PARTITION pminVALUES LESS THAN (to_days('2010-01-01')),
PARTITION p201001VALUES LESS THAN (to_days('2010-02-01')) ,
PARTITION p201002VALUES LESS THAN (to_days('2010-03-01')) ,
PARTITION p201003VALUES LESS THAN (to_days('2010-04-01')) ,
PARTITION p201004VALUES LESS THAN (to_days('2010-05-01')) ,
PARTITION p201005VALUES LESS THAN (to_days('2010-06-01')) ,
PARTITION p201006VALUES LESS THAN (to_days('2010-07-01')) ,
PARTITION p201007VALUES LESS THAN (to_days('2010-08-01')) ,
PARTITION p201008VALUES LESS THAN (to_days('2010-09-01')) ,
PARTITION p201009VALUES LESS THAN (to_days('2010-10-01')) ,
PARTITION p201010VALUES LESS THAN (to_days('2010-11-01')),
PARTITION p201011VALUES LESS THAN (to_days('2010-12-01')),
PARTITION p201012VALUES LESS THAN (to_days('2011-01-01')),
PARTITION pmax VALUESLESS THAN MAXVALUE );
2. 为现有表创建分区:
alter table 表名
PARTITION BY RANGE(to_days(`时间字段名`))
(PARTITION pminVALUES LESS THAN (to_days('2010-01-01')),
PARTITION p201001VALUES LESS THAN (to_days('2010-02-01')) ,
PARTITION p201002VALUES LESS THAN (to_days('2010-03-01')) ,
PARTITION p201003VALUES LESS THAN (to_days('2010-04-01')) ,
PARTITION p201004 VALUESLESS THAN (to_days('2010-05-01')) ,
PARTITION p201005VALUES LESS THAN (to_days('2010-06-01')) ,
PARTITION p201006VALUES LESS THAN (to_days('2010-07-01')) ,
PARTITION p201007VALUES LESS THAN (to_days('2010-08-01')) ,
PARTITION p201008VALUES LESS THAN (to_days('2010-09-01')) ,
PARTITION p201009VALUES LESS THAN (to_days('2010-10-01')) ,
PARTITION p201010VALUES LESS THAN (to_days('2010-11-01')),
PARTITION p201011VALUES LESS THAN (to_days('2010-12-01')),
PARTITION p201012VALUES LESS THAN (to_days('2011-01-01')),
PARTITION pmax VALUESLESS THAN MAXVALUE );
3. 删除表中的指定分区(删除分区会导致分区数据丢失,建议先备份):
ALTERTABLE 表名DROP PARTITION p0;
4. 追加表分区
需要先删除MAXVALUE分区后增加分区后再重建MAXVALUE分区,删除前需要先备份MAXVALUE分区数据.
ALTER TABLE 表名 DROPPARTITION pmax;
ALTER TABLE表名
ADD PARTITION (
PARTITION p201201VALUES LESS THAN (to_days('2012-2-1')),
PARTITION pmax VALUESLESS THAN MAXVALUE);
5. 查看标分区信息
SELECT
partition_namepart,
partition_expressionexpr,
partition_descriptiondescr,
table_rows
FROM
INFORMATION_SCHEMA.partitions
WHERE
TABLE_SCHEMA= schema()
AND
TABLE_NAME='表名';
6. 查看查询语句涉及分区信息
explainpartitions
select …from 表名 where …;
性能对比:
1. 测试环境
CPU: Intel 奔腾双核 E5300
硬盘: 西数(320GB/7200/16M 蓝盘)
内存: 南亚易胜 DDR2 800MHz 1GB + 三星 DDR2 800MHz 1GB
操作系统:Windows XP
MySQL版本: 5.1.57(5.1+版本支持分区表)
2. 表信息
表结构:
名 |
类型 |
长度 |
|
EQUIPMENTID |
char |
17 |
主键1 |
ATTRIBUTEID |
char |
4 |
主键2 |
VALUE |
varchar |
20 |
|
COLLECTTIME |
datetime |
|
主键3 |
总记录数:580W
分区信息(红色为主要测试区域):
part |
expr |
descr |
table_rows |
pmin |
to_days(COLLECTTIME) |
734138 |
2686 |
p201001 |
to_days(COLLECTTIME) |
734169 |
2511883 |
p201002 |
to_days(COLLECTTIME) |
734197 |
192497 |
p201003 |
to_days(COLLECTTIME) |
734228 |
811103 |
p201004 |
to_days(COLLECTTIME) |
734258 |
82894 |
p201005 |
to_days(COLLECTTIME) |
734289 |
109297 |
p201006 |
to_days(COLLECTTIME) |
734319 |
555065 |
p201007 |
to_days(COLLECTTIME) |
734350 |
742949 |
p201008 |
to_days(COLLECTTIME) |
734381 |
525900 |
p201009 |
to_days(COLLECTTIME) |
734411 |
89 |
p201010 |
to_days(COLLECTTIME) |
734442 |
71665 |
p201011 |
to_days(COLLECTTIME) |
734472 |
85964 |
p201012 |
to_days(COLLECTTIME) |
734503 |
1612 |
p201101 |
to_days(COLLECTTIME) |
734534 |
176 |
p201102 |
to_days(COLLECTTIME) |
734562 |
253 |
p201103 |
to_days(COLLECTTIME) |
734593 |
44824 |
p201104 |
to_days(COLLECTTIME) |
734623 |
62324 |
p201105 |
to_days(COLLECTTIME) |
734654 |
50658 |
p201106 |
to_days(COLLECTTIME) |
734684 |
0 |
p201107 |
to_days(COLLECTTIME) |
734715 |
0 |
p201108 |
to_days(COLLECTTIME) |
734746 |
0 |
p201109 |
to_days(COLLECTTIME) |
734776 |
0 |
p201110 |
to_days(COLLECTTIME) |
734807 |
0 |
p201111 |
to_days(COLLECTTIME) |
734837 |
0 |
p201112 |
to_days(COLLECTTIME) |
734868 |
0 |
p201201 |
to_days(COLLECTTIME) |
734899 |
0 |
p201202 |
to_days(COLLECTTIME) |
734928 |
0 |
pmax |
to_days(COLLECTTIME) |
MAXVALUE |
921 |
3. 查询效率对比
对比表:无分区表名nopart_data,有分区表名part_data
查询条件:select count(*) from 表名 where COLLECTTIME > 起始时间 and COLLECTTIME < 终止时间
查询耗时按照3次平均值统计
统计表:
开始时间 |
结束时间 |
查询结果 |
无分区耗时 |
有分区耗时 |
涉及分区 |
全部 |
5848859 |
6.26s |
9.58s |
全部 |
|
2010-5-1 |
2010-6-1 |
109086 |
7.04s |
0.48s |
pmin,p201005 |
2010-6-1 |
2010-7-1 |
554695 |
8.34s |
0.38s |
pmin,p201006 |
2010-7-1 |
2010-8-1 |
742565 |
7.57s |
0.43s |
pmin,p201007 |
2010-5-1 |
2010-7-1 |
663781 |
7.07s |
0.51s |
pmin,p201005,p201006 |
2010-6-1 |
2010-8-1 |
1297260 |
6.84s |
1.93s |
pmin,p201006,p201007 |
2010-5-1 |
2010-8-1 |
1406346 |
6.97s |
2.30s |
pmin,p201006,p201007,p201008 |
小结:
1) 分区表查询在查询上有明显优势.但在跨区查询时会有查询时间消耗,因此需要注意分区的疏密程度.
2) 每次查询都会查询pmin(第一个分区),因此需要尽量减少这个分区的数据.
4. 写入数据效率对比
COLLECTTIME |
无分区耗时 |
有分区耗时 |
2010-5-22 15:36 |
0.05s |
0.03s |
2010-6-22 15:36 |
0.02s |
0.05s |
2010-7-22 15:36 |
0.03s |
0.03s |
小结:
1) 分区对单条数据的插入操作无较大影响.
以上是我对MySQL的初体验总结,没啥心得体会,只有一点点成就感,希望和大家分享.
另外分区表尚存在问题:
1,是否可将分区表设置在不同硬盘,innodb可行?
2,是否可根据多条件进行水平分区,类似group by 列1,列2...
3,是否能将分区设置成不同引擎,例如当前使用中的分区为innodb,老的分区使用MyISAM
发表评论
-
MySQL中关于查询条件中的字符串空格问题
2013-02-20 19:17 7688假设当前mysql数据库中有个表:sysuser 有个字段 ... -
动态添加MYSQL从库,导出主库
2013-01-15 17:57 1011http://dev.mysql.com/doc/refman ... -
MySQL主从失败 错误Got fatal error 1236解决方法
2013-01-09 16:45 1061由于主服务器异外重启, ... -
mysql 语句的调度优先级及改变
2012-12-07 16:47 1262MySQL的默认的调度策略可用总结如下: · 写入操作优 ... -
小议同步IO :fsync与fdatasync
2012-09-13 20:23 717对于提供事务支持的 ... -
Linux修改MySql默认存储引擎为InnoDB
2012-09-13 18:25 1577一、关闭相关应用 二、停止mysql bin/m ... -
MySQL数据库的初始化mysql_install_db
2012-09-13 14:13 4682一、mysql_install_db说明 当MySQL的 ... -
[mysql]不要再执着于thread_concurrency
2012-08-20 10:51 3367结论: thread_concurrency 在GNU ... -
【转】对mysql日志进行操作的总结包括 启用,过期自动删除 等
2012-08-19 17:25 8861. 以前我错误的认为mysql的日志可以恢复到任何时 ... -
mysql 主从复制1201错误
2012-08-19 15:59 946工作日志之-MySQL slave Replication E ... -
binlog-format
2012-07-03 20:16 875面的这些是在网上找的 ... -
MYSQL5.1复制参数binlogformat(转)
2012-07-03 11:42 839http://apps.hi.baidu.com/share/ ... -
Mysql启动多个实例
2012-06-25 19:32 871系统环境:CentOS5操作步骤: cd /var/lib c ... -
mysql 5.5.* 下的主从模式
2012-05-29 10:30 756试验环境:服务器安装是按照张宴的环境配置的 http://bl ... -
MySQL创建用户与授权
2012-05-29 10:26 621一, 创建用户: 命令:CREATE USER ' ... -
MySQL配置文件my.cnf 例子最详细翻译
2012-05-29 10:21 945转的 MySQL配置文件my.cnf 例子最详细翻译,可以保存 ... -
MySQL源码分析(1):主要模块及数据流
2012-05-26 11:07 1136经过多年的发展,mysql的主要模块已经稳定,基本不会有大的修 ... -
mysql主从搭建实现
2012-05-25 21:43 812MySQL是应用广泛的关系型数据库,当数据规模逐渐扩大,并且重 ... -
mysql配置文件
2012-05-25 21:30 817[mysqld] port = 3306 serverid ... -
Handlersocket的安装
2012-05-25 21:13 852一、下载mysql,我选择的是mysql-5.5.15源码安装 ...
相关推荐
MySQL水平分区表实际操作总结 Mysql水平分表 mysql水平分表和垂直分表和数据库分区 sysbench mysql 坚持不懈 sysbench安装和使用 SHOW INNODB STATUS 探秘 体验Innodb with Memcached –安装 数据切分及整合方案 ...
1. 分区与分片:通过水平分区(如哈希、范围、列表分区)或垂直分区(数据拆分)可降低单表规模,提高查询效率。分片则可以将数据分散到多个服务器,实现水平扩展。 2. 主从复制:主从复制是MySQL常见的高可用和...
6. **可扩展性**:随着业务的增长,MySQL可以通过主从复制、分区、分片等技术进行水平或垂直扩展。 7. **丰富的API支持**:MySQL提供了多种编程语言的API,如Java的JDBC、Python的PyMySQL、PHP的PDO等,方便开发者...
在本实战体验中,我们将探讨几种不同的MysqlCluster配置方案,结合Java开发环境,来理解其工作原理和优势。以下是关于MySQL Cluster的一些关键知识点: 1. **分片(Sharding)**:MySQL Cluster通过数据分片实现...
此外,MySQL 5.0还引入了分区功能,允许大型表的数据水平分割,从而提高查询性能和管理效率。这对于大数据量的处理至关重要,尤其是对于需要进行复杂分析和报告的业务系统。 在SQL语法方面,MySQL 5.0支持更丰富的...
- **水平分区**:根据某列值将大表拆分成多个小表,提高查询效率。 - **垂直分区**:将一张大表按照列进行拆分,降低单个表的宽度。 - **组合使用**:结合水平和垂直分区技术,实现更高效的数据库管理。 #### 五、...
2. **分区表支持**:为了进一步提高查询性能和管理大型数据库的效率,MySQL 5.6增强了对分区表的支持,使得用户能够更灵活地管理和优化数据分布。 3. **多范围读取优化**(Multi-Range Read Optimization, MRR):这...
《Effective MySQL》是一本深入探讨MySQL数据库管理与优化的专业书籍,中文版的高清版提供了清晰易读的阅读体验。本书旨在帮助读者提升在MySQL环境中的工作效率,通过一系列实用的建议和最佳实践,来优化数据库性能...
- **分区与分片**:大表可以通过垂直分区(字段划分)或水平分区(数据划分)来分散负载,分片则是在多个服务器上分配数据。 - **缓存策略**:使用如Redis或Memcached等缓存系统,减少对数据库的直接访问。 4. **...
本文将详细介绍优化MySQL数据库性能的八大妙手,帮助你提升数据库效率,减少延迟,提高用户体验。 一、索引优化 索引是提高查询速度的关键。正确地创建和使用索引可以显著加快数据检索。应为经常用于搜索和排序的列...
3. **分区功能**:允许在单个表上进行水平分割,以提高查询性能和管理大量数据的能力。 4. **视图和存储过程**:提高了代码复用和复杂查询的管理。 5. **触发器和存储函数**:增强了数据库的业务逻辑处理能力。 6. *...
5. **扩展性与可维护性**:随着游戏用户数量的增长,MySQL可以通过集群、分片等技术进行水平扩展,以满足更大规模的数据存储和处理需求。同时,MySQL有着丰富的文档和社区支持,方便开发者进行问题排查和系统维护。 ...
例如,当用户数量达到一定规模时,可以通过水平分表将用户数据分散到多个物理表中,以降低单表压力,提高查询效率。此外,还可以使用主从复制实现数据备份和负载均衡,确保服务的连续性和可靠性。 最后,考虑到社交...
3. **应用程序与架构优化**:垂直或水平拆分数据库,实现读写分离,使用复制和负载均衡,优化频繁更新的表结构。 4. **查询优化**:合理利用索引,特别是联合索引;减小交互次数,使用固定格式SQL,缩短事务,避免...
5. **分区技术**:通过将大表分成较小的部分来改善查询性能。 ### 四、查询优化技巧 1. **避免使用SELECT ***:明确指定需要检索的列名而不是使用`SELECT *`,这样可以减少数据传输量。 2. **使用EXPLAIN分析查询...
在构建一个搜题系统时,数据库设计是至关重要的一步,因为它决定了系统的数据存储、查询效率以及...数据库设计的合理性直接影响到搜题系统的整体性能和用户体验,因此在设计之初就要充分考虑未来可能出现的扩展和变化。
分区技术可以有效分散单表压力、提高查询效率。常见的分区方式有范围分区(RANGE)、列表分区(LIST)及哈希分区(HASH)等。例如: - 使用范围分区按日期进行数据划分,便于历史数据归档; - 基于用户ID采用哈希...
5. **分区与分表**:如何通过分区策略改善大数据量表的查询性能,以及水平分表和垂直分表的方法。 6. **复制与集群**:MySQL的主从复制原理及配置,高可用性和读写分离策略,以及集群搭建与管理。 7. **备份与恢复...
2. **分区与分表**:通过垂直分区(按列划分)或水平分区(按行划分)降低单表规模,提高查询效率。分表可以进一步分为哈希分表、范围分表和列表分表。 三、内存配置优化 1. **缓冲池优化**:增大innodb_buffer_...