mysql的分区和视图

分区表

  • 分区表是一个独立的逻辑表,底层由多个物理子表组成,从存储引擎的角度来看,底层表和普通表没有任何区别

  • 每一个分区表都会有一个使用 # 分隔命名的表文件

  • 分区表的索引也是按照分区的子表定义的,没有全局索引,分区表的索引也只是再各个底层表中加上完全相同的索引

  • mysql再创建表的时候通过 partition by 字句定义每个分区存放的数据,分区表达式可以是列,也可以是包含列的表达式

  • 再执行查询的时候,优化器会根据分区定义过滤不需要的分区,只查找包含需要数据的分区

  • 分区的目的是把相关的数据存放再一起,如果想对某个分区进行操作就会很方便,例如删除整个分区

  • 分区不需要精确定位数据的位置,也就是不需要额外的数据结构,所以代价很低

分区的原因:

  • 再超大数据量的时候,索引就无法起作用了,除非是索引覆盖查询,否则会根据索引扫描的结果回表,如果数据量很大,会产生大量的随机i/o,数据库的响应时间可能会大到无法接受,而且维护索引的代价也非常高

  • 分区可以理解为索引的最初形态,以非常小的代价定位到数据再哪一片区域,再在这片区域里可以做顺序扫描,也可以建立索引,还可以把数据都缓存到内存中

分区适合的场景:

  • 表非常大,没办法全部放在内存中,或者只再表的最后部分有热点数据,其他都是历史数据

  • 分区可以更容易进行批量删除和更新操作

  • 分区可以分摊服务器压力,分区表的数据可以分布到不同的物理设备中

  • 分区有利于备份,和数据的恢复

分区的限制:

  • 一个表最多1024个分区
  • 如果分区字段中有主键或者唯一索引的列,那么主键列和唯一索引列都必须包含进来
  • 分区表不能使用外键
  • 所有的分区表存储引擎必须相同
  • 某些存储引擎不支持分区

分区表存在的问题:

  • 如果分区表达式的值可以为null,会使分区过滤无效

  • 如果定义的索引列和分区列不匹配,会导致查询无法进行分区过滤,

  • 分区有很多种类型,对于范围分区的成本会很高,因为服务器需要扫描所有的分区定义列表来寻找合适的分区

  • 执行sql语句的时候,需要先打开并锁住所有底层表,这个操作再分区过滤之前发生,会影响所有查询

  • 维护分区的成本可能会很高,新增和删除会很快,但是重组分区会很慢,需要先创建临时分区,将数据复制到临时表没然后删除原分区

视图

视图的理解

  • 视图是一种虚拟表 ,本身是不具有数据的,占用很少的内存空间,它是 SQL 中的一个重要概念。

  • 视图建立在已有表的基础上, 视图赖以建立的这些表称为基表。

  • 视图的创建和删除只影响视图本身,不影响对应的基表。但是当对视图中的数据进行增加、删除和修改操作时,数据表中的数据会相应地发生变化,反之亦然

  • 向视图提供数据内容的语句为SELECT 语句, 可以将视图理解为存储起来的 SELECT 语句。

  • 视图是向用户提供基表数据的另一种表现形式。当数据表比较复杂的情况下,视图可以帮助我 们把经常查询的结果集放到虚拟表中,提升使用效率。

不可更新的视图

  • 要使视图可更新,视图中的行和底层基本表中的行之间必须存在一对一 的关系。
  • 另外当视图定义出现如 下情况时,视图不支持更新操作:
    • 在定义视图的时候指定了“ALGORITHM = TEMPTABLE”,视图将不支持INSERT和DELETE操作;
    • 视图中不包含基表中所有被定义为非空又未指定默认值的列,视图将不支持INSERT操作;
    • 在定义视图的SELECT语句中使用了 JOIN联合查询 ,视图将不支持INSERT和DELETE操作;
    • 在定义视图的SELECT语句后的字段列表中使用了 数学表达式 或 子查询 ,视图将不支持INSERT,也 不支持UPDATE使用了数学表达式、子查询的字段值;
    • 在定义视图的SELECT语句后的字段列表中使用 DISTINCT 、 聚合函数 、 GROUP BY 、 HAVING 、 UNION 等,视图将不支持INSERT、UPDATE、DELETE; 在定义视图的SELECT语句中包含了子查询,而子查询中引用了FROM后面的表,视图将不支持 INSERT、UPDATE、DELETE;
    • 视图定义基于一个 不可更新视图 ;
    • 常量视图。

视图的优缺点

  • 优点:

    • 操作简单,将经常使用的查询操作定义为视图,就不需要关心表的结构、表与表之间的关联关系,以及业务逻辑和查询条件,只需要简单地操作视图,简化了对数据库的操作。
    • 视图跟实际数据表不一样,它存储的是查询语句。在使用的时候,要通过定义视图的查询语句来获取结果集,视图本身不存储数据,不占用数据存储的资源。
    • MySQL可以根据权限将用户对数据的访问限制在某些视图上,而不需要查询数据表,一定程度上保障了数据表中数据的安全性。
    • 当业务系统的需求发生变化后,如果需要改动数据表的结构,工作量相对较大,可以使用视图来减少改动的工作量。
  • 视图缺点

    • 如果实际数据表的结构变更了,我们就需要及时对相关的视图进行相应的维护。
    • 维护会变得比较复杂, 可读性不好 ,容易变成系统的潜在隐患,因为创建视图的 SQL 查询可能会对字段重命名,也可能包 含复杂的逻辑,这些都会增加维护的成本
    • 如果视图过多,会导致数据库维护成本的问题

视图的算法:

  • 合并算法
    • 服务器会将视图的sql和查询的sql合并
  • 临时表算法
    • 服务器先执行查询sql,把数据保存在和视图结构一样的临时表中,再基于临时表查询
  • 所以会尽可能的使用合并算法,但是如果视图中包含group by 、distinct 、聚合函数、union、子查询等,只要原表记录和视图无法建立一一映射场景,都会使用临时表算法来实现视图
存储程序
### MySQL 分区功能概述 MySQL分区功能允许将大表划分为更小、更具可管理性的部分,从而提高查询性能并简化维护工作。这种划分可以通过多种方式实现,包括范围分区(Range Partition)、列表分区(List Partition)、哈希分区(Hash Partition)以及键分区(Key Partition)等[^1]。 要查看 MySQL 表的分区信息,可以使用 `INFORMATION_SCHEMA.PARTITIONS` 系统视图。该视图提供了关于数据库中所有分区表的相关元数据,例如分区名称、类型、方法及其状态等[^4]。以下是具体的操作步骤: --- #### 使用 INFORMATION_SCHEMA 查看分区信息 通过查询 `INFORMATION_SCHEMA.PARTITIONS` 视图,可以获得有关特定表或整个数据库中所有分区的信息。下面是一个示例 SQL 查询: ```sql SELECT TABLE_NAME, PARTITION_NAME, PARTITION_ORDINAL_POSITION, PARTITION_METHOD, SUBPARTITION_NAME, PARTITION_EXPRESSION, TABLE_ROWS FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'your_database_name' -- 替换为实际的数据库名 AND TABLE_NAME = 'your_table_name'; -- 替换为实际的表名 ``` 此查询返回的结果包含了分区名称、分区顺序位置、使用的分区方法(如 RANGE 或 HASH)、子分区名称(如果存在),以及每个分区的大致行数估计值[^2]。 --- #### 显示当前数据库中的所有分区表 如果您想获取某个数据库下所有的分区表及其对应的分区详情,则可以运行如下脚本: ```sql SELECT DISTINCT TABLE_NAME, PARTITION_METHOD FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA = 'your_database_name'; ``` 这有助于快速识别哪些表已经启用了分区机制,并了解它们采用的具体分区策略[^3]。 --- #### 验证单个分区的存在性 假设您需要确认某张表是否存在名为 `p2023` 的分区,可以直接执行以下命令: ```sql SHOW CREATE TABLE your_table_name\G; ``` 或者利用之前提到过的 `INFORMATION_SCHEMA.PARTITIONS` 来定位具体的分区定义: ```sql SELECT * FROM INFORMATION_SCHEMA.PARTITIONS WHERE TABLE_SCHEMA='your_db_name' AND TABLE_NAME='your_table_name' AND PARTITION_NAME='p2023'; ``` 以上两种方法均能帮助管理员验证目标分区是否真实存在于系统之中。 --- ### 注意事项 尽管分区能够带来诸多好处,但在某些情况下也可能引入额外开销。因此,在决定实施分区前应充分评估其适用性潜在影响。例如,对于小型表格来说,启用分区反而可能导致性能下降;而对于频繁更新的历史记录清除需求而言,合理设计的分区方案则显得尤为重要。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值