热门标签 | HotTags
当前位置:  开发笔记 > 后端 > 正文

MySQL分区之RANGE分区

MySQL分区之RANGE分区环境:www.2cto.com[sql]mysql>selectversion()\G;***************************1.row***************************version():5.5.28㈠主要应用场景...

MySQL分区之RANGE分区
 
环境:  www.2cto.com  
[sql] 
mysql> select version()\G;  
*************************** 1. row ***************************  
version(): 5.5.28  
 
         ㈠ 主要应用场景
         
         RANGE分区主要用于日期列的分区
         例如销售类的表,可以根据年份来分区存储销售记录
         如下是对sales表进行分区
[sql] 
mysql> create table sales(money int unsigned not null,  
    -> date datetime  
    -> )engine=innodb  
    -> partition by range (year(date)) (  
    -> partition p2008 values less than (2009),  
    -> partition p2009 values less than (2010),  
    -> partition p2010 values less than (2011)  
    -> );  
Query OK, 0 rows affected (0.06 sec)  
  
mysql> insert into sales SELECT 100,'2008-01-01';  
Query OK, 1 row affected (0.02 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into sales SELECT 100,'2008-02-01';  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into sales SELECT 200,'2008-01-02';  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into sales SELECT 100,'2008-03-01';  
Query OK, 1 row affected (0.01 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into sales SELECT 100,'2009-03-01';  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into sales SELECT 200,'2010-03-01';  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> select * from sales;  
+-------+---------------------+  
| money | date                |  
+-------+---------------------+  
|   100 | 2008-01-01 00:00:00 |  
|   100 | 2008-02-01 00:00:00 |  
|   200 | 2008-01-02 00:00:00 |  
|   100 | 2008-03-01 00:00:00 |  
|   100 | 2009-03-01 00:00:00 |  
|   200 | 2010-03-01 00:00:00 |  
+-------+---------------------+  
6 rows in set (0.00 sec)  
 
          ① 便于对sales表管理,如果要删除2008年的数据,我们就不需要执行:
             delete from sales where date>= &#39;2008-01-01&#39; and date<&#39;2009-01-01&#39;
             而只需删除2008年数据所在的分区即可
[sql] 
mysql> alter table sales drop partition p2008;  
Query OK, 0 rows affected (0.10 sec)  
Records: 0  Duplicates: 0  Warnings: 0  
  
mysql> select * from sales;  
+-------+---------------------+  
| money | date                |  
+-------+---------------------+  
|   100 | 2009-03-01 00:00:00 |  
|   200 | 2010-03-01 00:00:00 |  
+-------+---------------------+  
2 rows in set (0.00 sec)  
 
          ② 另一个好处是加快某些查询操作,例如,我们只需要查询2009年整年的销售额
[sql] 
mysql> explain partitions  
    -> select * from sales  
    -> where date>=&#39;2009-01-01&#39; and date<=&#39;2009-12-31&#39;\G;  
*************************** 1. row ***************************  
           id: 1  
  select_type: SIMPLE  
        table: sales  
   partitions: p2009  
         type: ALL  
possible_keys: NULL  
          key: NULL  
      key_len: NULL  
          ref: NULL  
         rows: 4  
        Extra: Using where  
1 row in set (0.00 sec)  
 
          SQL优化器会进行分区修剪,即只搜索p2009
          也请注意分区的边界,如date<&#39;2010-01-01&#39;,那么优化器会连带搜索p2010分区
          
          ㈡ 常见相关问题
          
          ① 插入了一个不在分区中定义的值
[sql] 
mysql> insert into sales select 200,&#39;2012-12-3&#39;;  
ERROR 1526 (HY000): Table has no partition for value 2012  
mysql> show create table sales \G;  
*************************** 1. row ***************************  
       Table: sales  
Create Table: CREATE TABLE `sales` (  
  `money` int(10) unsigned NOT NULL,  
  `date` datetime DEFAULT NULL  
) ENGINE=InnoDB DEFAULT CHARSET=latin1  
/*!50100 PARTITION BY RANGE (year(date))  
(PARTITION p2009 VALUES LESS THAN (2010) ENGINE = InnoDB,  
 PARTITION p2010 VALUES LESS THAN (2011) ENGINE = InnoDB) */  
1 row in set (0.00 sec)  
  
ERROR:   
No query specified  
  
mysql> alter table sales add partition(  
    -> partition p2012 values less than maxvalue);  
Query OK, 0 rows affected (0.04 sec)  
Records: 0  Duplicates: 0  Warnings: 0  
  
mysql> insert into sales select 200,&#39;2012-12-3&#39;;  
Query OK, 1 row affected (0.01 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> select * from sales where date=&#39;2012-12-3&#39;;  
+-------+---------------------+  
| money | date                |  
+-------+---------------------+  
|   200 | 2012-12-03 00:00:00 |  
+-------+---------------------+  
1 row in set (0.00 sec)  
 
          ② 对RANGE分区的查询,优化器只能对year(),to_days(),to_seconds()和unix_timestamp()这类函数进行优化选择
[sql] 
mysql> create table t (date datetime)  
    -> engine=innodb  
    -> partition by range (year(date)*100+month(date)) (  
    -> partition p201201 values less than (201202),  
    -> partition p201202 values less than (201203),  
    -> partition p201203 values less than (201204)  
    -> );  
Query OK, 0 rows affected (0.02 sec)  
  
mysql> insert into t select &#39;2012-01-01&#39;;  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-01-06&#39;;  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-02-06&#39;;  
Query OK, 1 row affected (0.01 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-01-06&#39;;  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-03-06&#39;;  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-02-01&#39;;  
Query OK, 1 row affected (0.01 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> select * from t;  
+---------------------+  
| date                |  
+---------------------+  
| 2012-01-01 00:00:00 |  
| 2012-01-06 00:00:00 |  
| 2012-01-06 00:00:00 |  
| 2012-02-06 00:00:00 |  
| 2012-02-01 00:00:00 |  
| 2012-03-06 00:00:00 |  
+---------------------+  
6 rows in set (0.00 sec)  
  
mysql> explain partitions  
    -> select * from t  
    -> where date>=&#39;2012-01-01&#39; and date<=&#39;2012-01-31&#39;\G;  
*************************** 1. row ***************************  
           id: 1  
  select_type: SIMPLE  
        table: t  
   partitions: p201201,p201202,p201203  
         type: ALL  
possible_keys: NULL  
          key: NULL  
      key_len: NULL  
          ref: NULL  
         rows: 6  
        Extra: Using where  
1 row in set (0.00 sec)  
  
ERROR:   
No query specified  
  
mysql> drop table t;  
Query OK, 0 rows affected (0.01 sec)  
mysql> create table t (date datetime)  
    -> engine=innodb  
    -> partition by range (to_days(date)) (  
    -> partition p201201 values less than (to_days(&#39;2012-02-01&#39;)),  
    -> partition p201201 values less than (to_days(&#39;2012-03-01&#39;)),  
    -> partition p201201 values less than (to_days(&#39;2012-04-01&#39;))  
    -> );  
mysql> insert into t select &#39;2012-01-02&#39;;  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-01-03&#39;;  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-01-08&#39;;  
Query OK, 1 row affected (0.01 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-02-08&#39;;  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> insert into t select &#39;2012-03-08&#39;;  
Query OK, 1 row affected (0.00 sec)  
Records: 1  Duplicates: 0  Warnings: 0  
  
mysql> select * from t;  
+---------------------+  
| date                |  
+---------------------+  
| 2012-01-02 00:00:00 |  
| 2012-01-03 00:00:00 |  
| 2012-01-08 00:00:00 |  
| 2012-02-08 00:00:00 |  
| 2012-03-08 00:00:00 |  
+---------------------+  
5 rows in set (0.00 sec)  
  
mysql> explain partitions  
    -> select * from t  
    -> where date>=&#39;2012-01-01&#39; and date<=&#39;2012-01-31&#39;\G;  
*************************** 1. row ***************************  
           id: 1  
  select_type: SIMPLE  
        table: t  
   partitions: p1  
         type: ALL  
possible_keys: NULL  
          key: NULL  
      key_len: NULL  
          ref: NULL  
         rows: 3  
        Extra: Using where  
1 row in set (0.00 sec)  
 

推荐阅读
  • MyBatis入门指南:环境搭建与基础配置详解
    本文详细介绍了MyBatis的基础配置流程,包括在Maven项目中添加MyBatis依赖、IDEA中配置数据库连接、导入SQL脚本以及编写mybatis-config.xml配置文件等关键步骤。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 本文深入探讨了MySQL中的高级特性,包括索引机制、锁的使用及管理、以及如何利用慢查询日志优化性能。适合有一定MySQL基础的读者进一步提升技能。 ... [详细]
  • 在使用mybatis进行mapper.xml测试的时候发生必须为元素类型“mapper”声明属性“namespace”的错误项目目录结构UserMapper和UserMappe ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • Java连接MySQL数据库的方法及测试示例
    本文详细介绍了如何安装MySQL数据库,并通过Java编程语言实现与MySQL数据库的连接,包括环境搭建、数据库创建以及简单的查询操作。 ... [详细]
  • 本文详细介绍了如何使用SQL*Plus连接Oracle数据库以及使用MySQL客户端连接MySQL数据库的方法,包括基本命令和具体操作步骤。 ... [详细]
  • 本文探讨了如何使用Scrapy框架构建高效的数据采集系统,以及如何通过异步处理技术提升数据存储的效率。同时,文章还介绍了针对不同网站采用的不同采集策略。 ... [详细]
  • PHP中Smarty模板引擎自定义函数详解
    本文详细介绍了如何在PHP的Smarty模板引擎中自定义函数,并通过具体示例演示了这些函数的使用方法和应用场景。适合PHP后端开发者学习。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • 本文详细介绍了在MyBatis框架中如何通过#和$两种方式来传递SQL查询参数。使用#方式可以提高执行效率,而使用$则有助于在复杂SQL语句中更好地查看日志。此外,文章还探讨了不同场景下的参数传递方法,包括实体对象、基本数据类型以及混合参数的使用。 ... [详细]
  • 本文通过一系列实验,探讨了Oracle 11g数据库中密码错误验证延迟特性对用户登录速度的影响。实验旨在验证当某个用户因输入错误密码而触发延迟时,是否会影响其他用户的正常登录速度。 ... [详细]
  • SQL查询与事务管理:深入解析
    本文详细介绍了SQL查询的基本结构和高级特性,包括选择、分组查询以及权限控制等内容,并探讨了事务管理中的并发控制策略,旨在为数据库管理员和开发人员提供实用指导。 ... [详细]
  • 本文详细介绍了如何使用Linux下的mysqlshow命令来查询MySQL数据库的相关信息,包括数据库、表以及字段的详情。通过本文的学习,读者可以掌握mysqlshow命令的基本语法及其常用选项。 ... [详细]
  • PHP 图形函数中实现汉字显示的方法
    本文详细介绍了如何在 PHP 的图形函数中正确显示汉字,包括具体的步骤和注意事项,适合初学者和有一定基础的开发者阅读。 ... [详细]
author-avatar
多米音乐_34084632
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有