iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >怎么理解并掌握mysql的表
  • 195
分享到

怎么理解并掌握mysql的表

2024-04-02 19:04:59 195人浏览 独家记忆
摘要

本篇内容介绍了“怎么理解并掌握Mysql的表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一.索引组织表如

本篇内容介绍了“怎么理解并掌握Mysql的表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!

一.索引组织表
如果在创建表时没有定义主键,则innodb存储引擎会按如下方式选择或创建主键
-首先判断表中是否有非空的唯一索引,如果有则该列即为主键,当表中有多个非空唯一索引时,innodb存储引擎将选择建表时第一个定义的非空唯一索引为主键。
-如果不符合上述条件,innodb存储引擎自动创建一个6字节大小的指针。

点击(此处)折叠或打开

  1. 由于b为允许为null的唯一索引,所以该表的主键为d

  2. create table wwj.z(

  3.   a int not null,

  4.   b int null,

  5.   c int not null,

  6.   d int not null,

  7.   unique key (b),

  8.   unique key (d),

  9.   unique key (c)

  10. );

  11. insert into wwj.z select 1,2,3,4;

  12. insert into wwj.z select 5,6,7,8;

  13. insert into wwj.z select 9,10,11,12;


  14. mysql> select a,b,c,d,_rowid from wwj.z;

  15. +---+------+----+----+--------+

  16. | a | b | c | d | _rowid |

  17. +---+------+----+----+--------+

  18. | 1 | 2 | 3 | 4 | 4 |

  19. | 5 | 6 | 7 | 8 | 8 |

  20. | 9 | 10 | 11 | 12 | 12 |

  21. +---+------+----+----+--------+


二.innodb逻辑存储结构
1.表空间
默认为所有数据都存放在共享表空间中。如果开启参数innodb_file_per_table之后,则每张表的数据将会放在单独的表空间中。
如果启用了innodb_file_per_table,则每张表的表空间内存放的只是数据,索引,和插入缓冲的bitmap页。其他类的数据,如插入缓冲索引页,系统事务信息,二次写缓冲,还是存放在原来的共享表空间中。

2.段
表空间是由各个段组成的,常见的段有数据段,索引段,回滚段等。
段的管理都是由引擎自身所完成,DBA不能也没有必要对其进行控制。

3.区
区是由连续页组成的空间,在任何情况下每个区的大小都为1m。
为了保证区中页的连续性,innodb存储引擎一次从磁盘申请4~5个区。默认情况innodb存储引擎页的大小为16kb,即一个区中一共有64个连续的页。
当用户启用参数innodb_file_er_table后,创建的表默认大小是96kb,而不是区的默认大小1m。这是因为在每个段开始时,先用32个页大小的碎片页来存放数据,使用完这些碎片页后,才是64个连续页的申请。这样做的目的是,对于一些小表,或者是undo这类的段,可以在开始时申请较少的空间,节省磁盘容量的开销。

4.页
innodb磁盘管理的最小单位
常见的页类型有:
数据页
undo页
系统页
事务数据页
插入缓冲位图页
插入缓冲空闲列表页
未压缩的二进制大对象页
压缩的二进制大对象页

5.行
怎么理解并掌握mysql的表
三.innodb行记录格式
1.compact行记录格式
5.0以后引入,其设计目的是高效的存储数据,简单来说,一个页中存放的行数据越多,其性能越高。

2.redundant
5.0之前的行记录存储格式

3.行溢出数据
行存放varchar类型的数据最大长度和为65532字节。
建表时varchar(N)表示的是字符长度。

例如:下面建表语句将会报错
create table haha22(
 a varchar(65532)
) charset=utf8 engine=innodb;
ERROR 1074 (42000): Column length too big for column 'a' (max = 21845); use BLOB or TEXT instead

下面语句可以正常执行
create table haha22(
 a varchar(1)
) charset=utf8 engine=innodb;
insert into wwj.haha22 values ('阳');

行溢出数据存储图:
怎么理解并掌握mysql的表

那么多长的varchar是保存在单个数据页中的,从多长开始又会保存在blob页呢?
可以这样进行思考:innodb存储引擎表是索引组织的,即B+Tree结构,这样每个页中至少应该有两条行记录,因此如果页中只能存放下一条记录,那么innodb存储引擎会自动将行数据存放到溢出页中。
经过实验发现当行的长度为8098字节时,可以在页中放入两条记录,并且不用扩展至blob页。
对于TEXT 和 BLOB数据类型也是如此,如果在数据页中能存放至少2条记录,则将不会将记录扩展至blob页。


4.新的文件格式barracuda
该文件格式下拥有两种新的行记录格式:compressed 和 dynamic
新的记录格式对于存放在blob中的数据采用了完全的行溢出的方式,在数据页中只存放20个字节的指针,实际数据都存放在off page中,而之前的compact 和 redundant两种格式会存放768个前缀字节。

compressed行记录格式的另一个功能就是,存储在其中的行数据会以zlib的算法进行压缩。因此对于blob,text,varchar这类大长度类型的数据能够进行非常有效的存储。
怎么理解并掌握mysql的表
参数innodb_file_fORMat用来指定文件格式

四.约束
约束类型
primary key
unique key
foreign key
default
not null

五.分区表
1.mysql支持以下几种类型的分区:
range分区
list分区
hash分区
key分区
* 如果表中存在主键或唯一索引时,分区列必须是唯一索引的一个组成部分.如果建表时没有指定主键,唯一索引,可以指定任何一个列为分区列。
* mysql分区表中的索引都是局部分区索引,不支持全局索引


2.分区类型
(1).range分区
create table wwj.sales(
 money int,
    date1 datetime
) engine=innodb
partition by range(year(date1)) (
 partition p2008 values less than (year('2009-01-01')),
    partition p2009 values less than (year('2010-01-01')),
    partition p2010 values less than (year('2011-01-01'))
);
优化器只能对year(),to_days(),to_seconds(),unix_timestamp()这类函数进行优化选择

(2).list 分区
create table wwj.tt(
 a int,
    b int
) engine=innodb
partition by list(b) (
 partition p0 values in (1,3,5,7,9),
    partition p1 values in (0,2,4,6,8)
);

(3).hash 分区
目的是将数据均匀的分布到预先定义的各个分区中,保证各分区的数据量大致都是一样的
--普通hash分区
create table wwj.qqq(
 a int,
    b datetime
) engine=innodb
partition by hash (year(b)) 
partitions 4;
分配记录的算法如下:
mod(year('2010-04-01'),4) = mod(2010,4) =2
因此记录会放在p2分区中

--linear hash分区
create table wwj.qqq(
 a int,
    b datetime
) engine=innodb
partition by hash (year(b)) 
partitions 4;
分配记录的算法如下:
取大于分区数量4的下一个2的幂值V V=POWER(2,CEILING(LOG(2,num)))=4
所在分区N=YEAR('2010-04-01')&(V-1)=2
因此记录会放在p2分区中

linear hash分区的优点在于,增加,删除,合并,拆分分区将变得更加快捷,有利于处理含有大量数据的表。
缺点在于数据分布可能不太均衡。

(4).key分区
和hash分区相似,不同之处在于hash分区使用用户定义的函数进行分区,key分区使用mysql数据库提供的函数进行分区。
create table wwj.www(
 a int,
    b datetime
) engine=innodb
partition by key (b) 
partitions 4;

(5).columns 分区
前面的4种分区中,分区的条件是:数据必须是整形,如果不是整形,则需要通过函数将其转化为整形。
columns分区可以直接使用非整形的数据进行分区,分区根据类型直接比较而得,不需要转化为整形,并且支持多个列的值进行分区。
columns支持以下数据类型:
int,smallint,tinyint,bigint,date,datetime,char,varchar,binary,varbinary

“怎么理解并掌握mysql的表”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注编程网网站,小编将为大家输出更多高质量的实用文章!

您可能感兴趣的文档:

--结束END--

本文标题: 怎么理解并掌握mysql的表

本文链接: https://www.lsjlt.com/news/65294.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 怎么理解并掌握mysql的表
    本篇内容介绍了“怎么理解并掌握mysql的表”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一.索引组织表如...
    99+
    2024-04-02
  • 怎么理解并掌握MySQL
    本篇内容主要讲解“怎么理解并掌握MySQL”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解并掌握MySQL”吧!MySQL分为 server 层和存储引擎...
    99+
    2024-04-02
  • 怎么理解并掌握mysql中的information_schema
    本篇内容介绍了“怎么理解并掌握mysql中的information_schema”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细...
    99+
    2024-04-02
  • 怎么理解并掌握MySQL Server Startup Script
    本篇内容介绍了“怎么理解并掌握MySQL Server Startup Script”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家...
    99+
    2024-04-02
  • 怎么理解并掌握RAC
    这篇文章主要介绍“怎么理解并掌握RAC”,在日常操作中,相信很多人在怎么理解并掌握RAC问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解并掌握RAC”的疑惑有所帮助!接...
    99+
    2024-04-02
  • 怎么理解并掌握Redis
    本篇内容介绍了“怎么理解并掌握Redis”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Redis是一个开源的使用ANSI C语言编写、支持网...
    99+
    2023-06-02
  • 怎么理解并掌握JVM
    本篇内容介绍了“怎么理解并掌握JVM”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、JVM的基本介绍JV...
    99+
    2024-04-02
  • 怎么理解并掌握mysql的show processlist time负数
    本篇内容介绍了“怎么理解并掌握mysql的show processlist time负数”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望...
    99+
    2024-04-02
  • 怎么理解并掌握Java的AVL树
    这篇文章主要介绍“怎么理解并掌握Java的AVL树”,在日常操作中,相信很多人在怎么理解并掌握Java的AVL树问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解并掌握J...
    99+
    2024-04-02
  • 怎么理解并掌握JavaScript中的this
    这篇文章主要介绍“怎么理解并掌握JavaScript中的this”,在日常操作中,相信很多人在怎么理解并掌握JavaScript中的this问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望...
    99+
    2024-04-02
  • 怎么理解并掌握Python线程
    这篇文章主要讲解了“怎么理解并掌握Python线程”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解并掌握Python线程”吧!1.自定义进程自定义进程类,继承Process类,重写ru...
    99+
    2023-06-25
  • 怎么理解并掌握mysql参数文件和类型
    这篇文章主要讲解了“怎么理解并掌握mysql参数文件和类型”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解并掌握mysql参数文件和类型”吧!1.&n...
    99+
    2024-04-02
  • 怎么理解并掌握JS装饰器
    本篇内容介绍了“怎么理解并掌握JS装饰器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. 前言装饰器是最...
    99+
    2024-04-02
  • 怎么理解并掌握mysql索引之前缀索引
    本篇内容主要讲解“怎么理解并掌握mysql索引之前缀索引”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解并掌握mysql索引之前缀索引”吧!有时候需要很长...
    99+
    2024-04-02
  • 怎么理解并掌握Rust包管理器Cargo
    本篇内容主要讲解“怎么理解并掌握Rust包管理器Cargo”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么理解并掌握Rust包管理器Cargo”吧!Rust 是一种现代编程语言,可提供高性能、...
    99+
    2023-06-16
  • 怎么掌握mysql多表操作
    本篇内容主要讲解“怎么掌握mysql多表操作”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“怎么掌握mysql多表操作”吧!多表关系一对一(一般是合并表), 一对...
    99+
    2024-04-02
  • 怎么理解并掌握python正则表达式和re模块
    这篇文章主要介绍“怎么理解并掌握python正则表达式和re模块”,在日常操作中,相信很多人在怎么理解并掌握python正则表达式和re模块问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解并掌握pyth...
    99+
    2023-06-01
  • 如何理解并掌握HashMap
    这篇文章主要介绍“如何理解并掌握HashMap”,在日常操作中,相信很多人在如何理解并掌握HashMap问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何理解并掌握HashMap”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-16
  • 怎么理解并掌握Python逻辑回归
    这篇文章主要讲解了“怎么理解并掌握Python逻辑回归”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解并掌握Python逻辑回归”吧!def sigmoid(x):定义sig...
    99+
    2023-06-02
  • 怎么理解并掌握JavaScript中的this关键字
    这篇文章主要讲解了“怎么理解并掌握JavaScript中的this关键字”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么理解并掌握JavaScript中的...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作