分区表:

分区表是一个独立的逻辑表,底层通过多个物理表实现。

mysql实现分区表的方式是对底层表的封装。这意味着没有全局索引,索引是建立在底层的每个表上的(跟ORACLE不一样)。

用到分区表的几种情况:

  • 数据量非常大,无法全部放到内存中。
  • 只有部分数据是热点数据,其他数据是历史数据。

限制:

  • 一个表只能有1024个分区,作者在100个以下是稳定的,太多会有性能问题。
  • 分区表无法使用外键约束。
  • PARTITION BY RANGE分区表达式必须是整数或者返回整数的表达式。
  • PARTITIONED BY RANGE COLUMNS分区可以接受整形,日期型,字符型作为分区参数。
  • 所有的分区都必须使用相同的存储引擎。

会出现的问题:

  • 如果使用PARTITION BY RANGE,所有在分区表达式上的null值(本身就是null或者使用一个非法值的时候)会被放在第一个分区。在做查询的时候,不仅会查询where所在的分区,还会查询第一个null所在的分区。如果第一个分区很大,那么将会有性能隐患。解决方法,把第一个分区的数据量减少。或者做一个空分区为第一个分区。

附上PARTITION BY RANGE例子:

  1. CREATE TABLE employees (
  2. id INT NOT NULL,
  3. fname VARCHAR(30),
  4. lname VARCHAR(30),
  5. hired DATE NOT NULL DEFAULT '1970-01-01',
  6. separated DATE NOT NULL DEFAULT '9999-12-31',
  7. RANGE Partitioning
  8. 3001
  9. job_code INT NOT NULL,
  10. store_id INT NOT NULL
  11. )
  12. PARTITION BY RANGE (store_id) (
  13. PARTITION p0 VALUES LESS THAN (6),
  14. PARTITION p1 VALUES LESS THAN (11),
  15. PARTITION p2 VALUES LESS THAN (16),
  16. PARTITION p3 VALUES LESS THAN (21)
  17. )
  • 分区列和索引列不匹配。例如在a列上建立了分区,在b列上建立了索引,在使用b=?进行检索的时候,如果没有a的条件来限制要扫描的分区,那么将要在每个分区上查找b索引。如果分区比较多,也是性能隐患。

EXPLAIN PARTITIONS 查看使用了哪些分区

  1. CREATE TABLE trb1 (id INT, name VARCHAR(50), purchased DATE)
  2. PARTITION BY RANGE(id)
  3. (
  4. PARTITION p0 VALUES LESS THAN (3),
  5. PARTITION p1 VALUES LESS THAN (7),
  6. PARTITION p2 VALUES LESS THAN (9),
  7. PARTITION p3 VALUES LESS THAN (11)
  8. );
  9. (1, 'desk organiser', '2003-10-15'),
  10. (2, 'CD player', '1993-11-05'),
  11. Obtaining Information About Partitions
  12. 3044
  13. (3, 'TV set', '1996-03-10'),
  14. (4, 'bookcase', '1982-01-10'),
  15. (5, 'exercise bike', '2004-05-09'),
  16. (6, 'sofa', '1987-06-05'),
  17. (7, 'popcorn maker', '2001-11-22'),
  18. (8, 'aquarium', '1992-08-04'),
  19. (9, 'study desk', '1984-09-16'),
  20. (10, 'lava lamp', '1998-12-25');
  21. mysql> EXPLAIN PARTITIONS SELECT * FROM trb1\G
  22. *************************** 1. row ***************************
  23. id: 1
  24. select_type: SIMPLE
  25. table: trb1
  26. partitions: p0,p1,p2,p3
  27. type: ALL
  28. possible_keys: NULL
  29. key_len: NULL
  30. ref: NULL
  31. rows: 10
  32. Extra: Using filesort
  33. mysql> EXPLAIN PARTITIONS SELECT * FROM trb1 WHERE id < 5\G
  34. *************************** 1. row ***************************
  35. id: 1
  36. select_type: SIMPLE
  37. table: trb1
  38. partitions: p0,p1
  39. type: ALL
  40. possible_keys: NULL
  41. key_len: NULL
  42. ref: NULL
  43. rows: 10
  44. Extra: Using where

高性能mysql 第7章 mysql高级特性之分区表的更多相关文章

  1. 高性能mysql 第1章 mysql架构与历史

    mysql逻辑架构图: 第一层 客户端 第二层(服务层):针对所有类型的存储引擎可以公共提取的部分.将存储引擎抽离之后的其他部分都在这里.如:查询解析,分析优化,内置函数,存储过程,触发器,视图. 第 ...

  2. MySQL高级特性之分区表

    对于用户而言,分区表是一个独立的逻辑表,但是在底层由多个物理子表组成.实现分区的代码实际上是对一组底层表的句柄对象的封装,对分区表的请求都会通过句柄对象转化成对存储引擎的接口调用 意义 MySQL在创 ...

  3. 《高性能MySQL》——第一章MySQL的架构与历史

    1.可以使用SHOW TABLE STATUS查询表的相关信息. 2.默认存储引擎是InnoDB,如果没有什么很特殊的要求,InnoDB引擎是我们最好的选择. 3.mysql的infobright引擎 ...

  4. 高性能mysql笔记 第一章 mysql架构

    1.1  mysql逻辑结构 第一层: 负责连接处理,授权认证,安全等事情 第二层:负责mysql的大部分核心功能 ,查询解析,分析,优化,缓存和所有的内置函数,所有跨存储引擎的功能都在这一层实现,, ...

  5. java 第七章 面向对象高级特性

    一.类的继承 (一)继承的含义 1.在Java中定义一个类时,让该类通过关键字extends继承一个已有的类,这就是类的继承(泛化). 2.被继承的类称为父类(超类,基类),新的类称为子类(派生类). ...

  6. mysql笔记04 MySQL高级特性

    MySQL高级特性 1. 分区表:分区表是一种粗粒度的.简易的索引策略,适用于大数据量的过滤场景.最适合的场景是,在没有合适的索引时,对几个分区进行全表扫描,或者是只有一个分区和索引是热点,而且这个分 ...

  7. 【MySQL高级特性】高性能MySQL第七章

    2017-07-25 14:15:43 前言:MYSQL从5.0和5.1版本开始引入了很多高级特性,例如分区.触发器等,这对有其他关系型数据库使用 背景的用户来说可能并不陌生.这些新特性吸引了很多用户 ...

  8. 干货:鲜为人用的MySQL高级特性与玩法!

    上一篇文章<万字总结:学习MySQL优化原理,这一篇就够了!>文末给大家留有两个开放的问题: 有非常多的程序员在分享时都会抛出这样一个观点:尽可能不要使用存储过程,存储过程非常不容易维护, ...

  9. MySQL高级特性

    MySQL管理 用户管理 CREATE USER username IDENTIFIED BY 'password'; 新建用户 CREATE USER@'%' IDENTIFIED BY 'pass ...

随机推荐

  1. Qt QLabel添加cliked事件

    #ifndef MYLABEL_H #define MYLABEL_H #include <QObject> #include <QLabel> class MyLabel : ...

  2. Oracle三种排名函数使用

    1) SELECT s.*,Row_Number() OVER (partition by c_name ORDER BY grade desc) rank FROM score s 2) SELEC ...

  3. 【学习笔记】APP页面,随机选择一个选项

    如下页面,一个测评功能,30个题目,每题的答案选项一样: 要实现每题自动随机选择一个答案 方法一:定义一个5个选项的列表,循环30次,然后使用random.shuffle打乱列表顺序,根据列表元素定位 ...

  4. 【Git】工作中99%能用到的git命令

    Git使用笔记 1.第一次使用github ============================================= 1)github注册账号 使用邮箱注册账号 先不要创建版本库 2 ...

  5. 网页制作入门——HTML(2)编码与字符实体

    在上一期,我们顺口提到了——你写的网页在打开后,可能发现只是一串乱码.那么这是为什么呢? 这就是编码的神奇力量! 八卦的启示——什么是编码? 编码的思想,很早就在中国诞生了,从还不太明朗的结绳记事.算 ...

  6. 【神经网络与深度学习】【C/C++】比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能

    比较OpenBLAS,Intel MKL和Eigen的矩阵相乘性能 对于机器学习的很多问题来说,计算的瓶颈往往在于大规模以及频繁的矩阵运算,主要在于以下两方面: (Dense/Sparse) Matr ...

  7. 【CUDA开发】Thrust库

    Thrust库从C++的STL中得到灵感,将最简单的类似于STL的结构放在Thrust库中,比如STL中的vector.此外,Thrust库还包含STL中的算法和迭代器.        Thrust函 ...

  8. SVN简单流程总结

    1   创建仓库 2   启动svn服务器 svnserve -d -r 仓库地址(如:D:\SVN\repoDemo1) 3   新的用户第一次与服务器交互时,需要使用checkout将仓库检出到本 ...

  9. windows 安装 python 踩坑记录

    官方不建议使用 64 bit python,容易出各种问题 Unable to find vcvarsall.bat 凡是安装与操作系统底层相关的 python 扩展都会遇到这个问题,如 PIL,Pi ...

  10. Dapper多表查询时子表字段为空

    最近在学习使用Dapper时百度了一篇详细使用教程,在做到多表查询的时候,出现如下情况. 使用的SQL如下, SELECT * FROM [Student] AS A INNER JOIN [Juni ...