zoukankan      html  css  js  c++  java
  • 读mysql技术内幕InnoDB 第四章

    表:

    mysql InnoDB的存储逻辑结构和Oracle大致相同,--表空间:段 segment,区:extent  页:page(块,block)

    对于mysql的隐行主键我就不做介绍了,以前说过

    InnoDB引擎,在rollback的时候不会去回收表空间,而是将undo信息判断是否需要,不需要就标记为可用空间,下次Undo使用

    段:数据段,索引段,回滚段等,

    INNODB的引擎对段的管理师有引擎本身完成的,不是每个对象都有段,表空间是有分散的页和段组成的。

    区:64个连续的page组成,每个page16K,sql server 8K

    对于大的数据InnoDB引擎,每次最多可以申请4个区,来保证数据的顺序性

    页:

    InnoDB磁盘管理的最小的单位,数据页B-tree Node,Undo页,系统页,事务数据页,插入缓冲位图页,插入缓冲空闲列表页

    未压缩的二进制大对象页,压缩的二进制大对象页

    行:

    InnoDB存储引擎是面向行的,类型有:Compact和Redundant,show table status  like  'test'\G; row_famact 是行的记录 结构类型

    Comapact 行记录:

         目标能高效的存放数据,

    Null值,除了占用Null的标志位置,不占用任何空间,(varchar,char)

    Redundant 行记录格式

    为了兼容5.0以前的版本

    varchar 的null值不占空间,char的Null值占用空间

    char 会占据可能存放的最大值字节数

    上边这些的,我不是不关心,只不过是目前我还没遇到过什么问题,我重点要说的是下面的,我曾经遇到过的问题:

    ----------------------------------------------------------------******************——————————————————————————————————————

    行溢出:

    我曾经遇到这个问题是在我创建数据表的时候,有多个varchar(7000),我不知道为什么当时我的数据库会提示我把类型转换成text,现在才发现自己太弱了

    我只能说虽然varchar的存储是65535,但是他指的是所有varchar列长度的总和,而不是单独一个的,

    varchar 溢出的时候,保存在blob中

    编码也会影响的,字符占的字节导致的这种情况的产生

    GBK,每个字符最多2个字节,UTF8,每个字符最多3个字节

    转化varchar-》text

    在InnoDB 内部对于多字节字符集类型的存储,char很明确的被视为变长类型,

    视图,触发器,我这里不做太多的描叙,因为以前的文章写过

    外键:

    分区:

    mysql 支持的分区类型为水平分区

    key分区:根据mysql提供的哈希函数分区

    如果表中存在主键或者唯一索引的时候,分区列必须是唯一索引的一个组成部分

    hash分区:按照用户自定义的表达式的返回值来进行分区,返回值不能为负数

    1 create table test12(
    2     id tinyint  not null,
    3     count int not null,
    4     primary key(count,id),
    5     unique key(count)      
    6 )engine=innodb 
    7 PARTITION BY HASH(count);

    我第一次出现了这个错误:

    这是因为在创建分区的时候,。数据库要求我们创建分区的字段必须在主键里面

    如下:

    range分区:行数据基于一个给定的连续区间的列值放入分区



    1
    create table tests( 2 date datetime 3 )engine=innodb 4 partition by range (YEAR(date))( 5 partition p2008 values less than(2009), 6 partition p2009 values less than(2010), 7 8 );

    在使用分区的时候,我们要记得优化自己的sql语句

    list分区:list分区面向的是散列的值

    1 create table tests(
    2    count tinyint 
    3 )engine=innodb
    4 partition by list(count)(
    5  partition p1 values in (2,5,8),
    6  partition p2 values in (3,6,9),
    7 
    8 );

    Key分区

    1 create table tests(
    2    count tinyint 
    3 )engine=innodb
    4 partition by key(count);

     这四种分区的条件必须是整型,不是整型的也要转换成整型

    Hash和Key的区分对于NUll的处理,总是返回0

    List分区必须指明那个分区存储NUll

    Range分区下Null值会被放入最左边的分区

    py_innodb_page_info.py 工具介绍

    使用之前,机器上必须安装python,大家有时间看一下

    保证你的机器由运行py_innodb_page_info.py的权限

    进入文件目录:./py_innodb_page_info.py -v /文件名称

     

  • 相关阅读:
    C++11 Lambda表达式
    C++ 容器操作
    C/C++ 动态存储分配 malloc calloc realloc函数的用法与区别
    使用visual C++测试
    设计模式有感
    smartProgram学习笔记
    C++析构函数
    C++指针和引用
    Python机器学习笔记:常用评估模型指标的用法
    Python机器学习笔记:不得不了解的机器学习面试知识点(1)
  • 原文地址:https://www.cnblogs.com/zhangjun516/p/3028484.html
Copyright © 2011-2022 走看看