为什么推荐InnoDB引擎使用自增主键?

为什么推荐InnoDB引擎使用自增主键?

经常看到有帖子或博客讨论主键选择问题,有人建议使用业务无关的自增主键,有人觉得没有必要,完全可以使用如学号或身份证号这种唯一字段作为主键。不论支持哪种论点,大多数论据都是业务层面的。如果从数据库索引优化角度看,使用InnoDB引擎而不使用自增主键绝对是一个糟糕的主意。下面从各个方面来讨论一下。 在使用InnoDB存储引擎时,如果没有特别的需要,请永远使用一个与业务无关的自增字段作为主键,除非高并发写入操作可能需要衡量自增主键或有业务安全性要求,后面会讲。 一、首先不管主键策略是什么,这两点都是必须遵守的。 主键不可修改 对于数据库来说,主键其实是可以修改的,只要不和其他主键冲突就可以。但是,对于应用来说,如果一条记录要修改主键,那就会出大问题。 因为主键的第二个作用是让其他表的外键引用自己,从而实现关系结构。一旦某个表的主键发生了变化,就会导致所有引用了该表的数据必须全部修改外键。很多Web应用的数据库并不是强约束(仅仅引用主键但并没有设置外键约束),修改主键会导致数据完整性直接被破坏。 业务字段不可用于主键 所有涉及到业务的字段,无论它看上去是否唯一,都决不能用作主键。例如,用户表的Email字段是唯一的,但是,如果用它作主键,就会导致其他表到处引用Email字段,从而泄露用户信息。 类似的,看上去唯一的用户名、身份证号等,也不能用作主键。对这些唯一字段,应该加上unique索引约束。 此外,修改Email实际上是一个业务操作,这个操作就直接违反了上一条原则。 那么,主键应该使用哪个字段呢? 主键必须使用单独的,完全没有业务含义的字段,也就是主键本身除了唯一标识和不可修改这两个责任外,主键没有任何业务含义。 二、主键应该用什么类型? 上面说了,不考虑业务,从数据库索引优化角度看,使用InnoDB引擎而不使用自增主键绝对是一个糟糕的主意。 下面先简单说说MySQL索引实现。在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。 MyISAM存储引擎 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。 下图是MyISAM索引的原理图: 这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引(Primary key)示意。可以看出MyISAM的索引文件仅仅保存数据记录的地址。在MyISAM中,主索引和辅助索引(Secondary key)在结构上没有任何区别,只是主

适用于 Windows 10 的 8 个最佳沙盒应用程序可确保您的安全

适用于 Windows 10 的 8 个最佳沙盒应用程序可确保您的安全

尽管这些年来 Windows 10 的安全性有了很大的提高,但在从 Internet 下载神秘软件、打开有些可疑的电子邮件附件等时,您仍然不能太小心。 这是沙箱派上用场的一种方式。 沙箱是一个虚拟环境,您可以在其中安装和运行新的或不受信任的应用程序,而不会让它们损害您的系统。 这意味着您可以下载软件,打开它并使用它,同时查看它在安全隔离空间中的行为是否可疑。 如果软件检出,您可以 close 沙箱(自动删除其中的任何数据),然后下载真正的软件! Windows 10 有大量不同的沙盒应用程序,其中许多应用程序略有不同,并且专注于不同的任务。 以下列表是您今天可以下载的最佳列表。 相关参考: 适用于 iOS 的 UpWord 便笺:适用于 iPhone 的基于手势的纯文本便笺和提醒 适用于 Windows 7 的 Windows 8 皮肤包 1. 启用 Windows 10 沙盒 如果您拥有专业版、企业版或教育版的 Windows 10,那么您就可以使用一系列新功能。 其中最好的(并且隐藏得很好)之一是沙箱功能,您只需单击几下即可启用该功能。 要启用 Windows 沙盒,请单击开始,然后搜索“Windows 功能”并单击“打开或关闭 Windows 功能”。 在新窗口中,向下滚动并选中“Windows Sandbox”框,单击“确定”并重新启动您的 PC。 您现在应该可以通过“开始”菜单搜索“windows sandbox”。 在那里找到它,点击它打开它,然后你就离开了。 如果您没有看到 Sandbox 选项,那么您可能需要转到您的主板 BIOS(通常通过在您的 PC 启动时按 Delete、F2 或 F8 键)并环顾四周以启用硬件虚拟化。 2. BitBox(盒内浏览器) 短缺 ”盒子里的浏览器,”该工具专为在沙盒环境中浏览网页而设计。 它有两个 Chrome 和 Firefox 风格,几乎是专为浏览而设计的 Linux 的 Virtualbox 实例,这意味着它比此列表中的其他选项对内存的要求更高。 BitBox 具有将文件下载到您的实际 PC 的功能,因此您决定是否希望发生这种情况并进行适当的设置非常重要。 它采取了至关重要的预防措施,例如禁用麦克风和监控所有主机与 BitBox 的交互,使其成为可靠且安全的选择。 3.缓冲区 缓冲区 是一个端点沙盒工具,这意味着如果您要访问可能对您的计算机安全有一点危险的 Internet 部分,或者有人递给您一个您不太信任的 U 盘(这种情况发生在每个人身上,对吧?),通过 BufferZone 运行它们可能是个好主意。 添加不同的程序以通过 BufferZone 运行很容易,并且每个主要的 Web 浏览器都可以很好地使用它。 与其他沙盒软件相比,它的一

decimal(numeric )、float 和 real 数据类型的区别

decimal(numeric )、float 和 real 数据类型的区别

decimal(numeric ) 同义,用于精确存储数值 float 和 real 不能精确存储数值 decimal数据类型最多可存储 38 个数字,所有数字都能够放到小数点的右边。decimal数据类型存储了一个准确(精确)的数字表达法;不存储值的近似值。 定义decimal的列、变量和参数的两种特性如下: p 小数点左边和右边数字之和,不包括小数点。如 123.45,则 p=5,s=2。 指定精度或对象能够控制的数字个数。 s 指定可放到小数点右边的小数位数或数字个数。 p 和 s 必须遵守以下规则:0 <=s<=p<= 38。 numeric和decimal数据类型的默认最大精度值是 38。在 Transact-SQL 中,numeric与decimal数据类型在功能上等效。 当数据值一定要按照指定精确存储时,可以用带有小数的decimal数据类型来存储数字。 float 和 real 数据 float和real数据类型被称为近似的数据类型。在近似数字数据类型方面,float和real数据的使用遵循 IEEE 754 标准。 近似数字数据类型并不存储为多数数字指定的精确值,它们只储存这些值的最近似值。在很多应用程序中,指定值与存储值之间的微小差异并不明显。但有时这些差异也值得引起注意。由于float和real数据类型的这种近似性,当要求精确的数字状态时,比如在财务应用程序中,在那些需要舍入的操作中,或在等值核对的操作中,就不使用这些数据类型。这时就要用integer、decimal、money或smallmone数据类型。 在 WHERE 子句搜索条件中(特别是 = 和 <> 运算符),应避免使用float或real列。最好限制使用float和real列做> 或 < 的比较。 IEEE 754 规格提供了四种舍入模式:舍入到最接近的值、上舍入、下舍入和舍入到零。Microsoft® SQL Server™ 使用上舍入。所有的数值必须精确到确定的精度,但会产生细小的浮点值变化。因为浮点数字的二进制表示法可以采用很多合法舍入规则中的任意一条,因此我们不可能可靠地量化一个浮点值。 转换 decimal 和 numeric 数据 对于decimal和numeric数据类型,Microsoft® SQL Server™ 将精度和小数位数的每个特定组合看作是不同的数据类型。例如,decimal(5,5) 和decimal(5,0) 被当作不同的数据类型。 在 Transact-SQL 语句中,带有小数点的常量自动转换为numeric数据值,且必然使用最小的精度和小数位数。例如,常量 12.345 被转换为numeric值,其精度为 5,小数位为 3。 从decimal或numeric向float或real转换会导致精度损失。从int、smallint、tinyint、float、real、money或smallmoney向decimal或numeric转换会导致溢

聊聊page cache与Kafka之间的事儿

聊聊page cache与Kafka之间的事儿

前言 关于Kafka的一个灵魂拷问:它为什么这么快? 或者说,为什么它能做到如此大的吞吐量和如此低的延迟? 有很多文章已经对这个问题给出了回答,但本文只重点研究其中的一个方向,即对page cache的使用。先简单地认识一下Linux系统中的page cache(顺便也认识一下buffer cache)。 page cache & buffer cache 执行free命令,注意到会有两列名为buffers和cached,也有一行名为“-/+ buffers/cache”。 ~ free -m total used free shared buffers cached Mem: 128956 96440 32515 0 5368 39900 -/+ buffers/cache: 51172 77784 Swap: 16002 0 16001 其中,cached列表示当前的页缓存(page cache)占用量,buffers列表示当前的块缓存(buffer cache)占用量。用一句话来解释:page cache用于缓存文件的页数据,buffer cache用于缓存块设备(如磁盘)的块数据。页是逻辑上的概念,因此page cache是与文件系统同级的;块是物理上的概念,因此buffer cache是与块设备驱动程序同级的。 page cache与buffer cache的共同目的都是加速数据I/O:写数据时首先写到缓存,将写入的页标记为dirty,然后向外部存储flush,也就是缓存写机制中的write-back(另一种是write-through,Linux未采用);读数据时首先读取缓存,如果未命中,再去外部存储读取,并且将读取来的数据也加入缓存。操作系统总是积极地将所有空闲内存都用作page cache和buffer cache,当内存不够用时也会用LRU等算法淘汰缓存页。 在Linux 2.4版本的内核之前,page cache与buffer cache是完全分离的。但是,块设备大多是磁盘,磁盘上的数据又大多通过文件系统来组织,这种设计导致很多数据被缓存了两次,浪费内存。所以在2.4版本内核之后,两块缓存近似融合在了一起:如果一个文件的页加载到了page cache,那么同时buffer cache只需要维护块指向页的指针就可以了。只有那些没有文件表示的块,或者绕过了文件系统直接操作(如dd命令)的块,才会真正放到buffer cache里。因此,我们现在提起page cache,基本上都同时指page cache和buffer cache两者,本文之后也不再区分,直接统称为page cache。 下图近似地示出32-bit Linux系统中可能的一种page cache结构,其中block size大小为1KB,page size大小为4KB。 page cache中的每个文件都是一棵基数树(radix tree,本质上是多叉搜索树),

idea 中解决maven 包冲突的问题(maven helper)

idea 中解决maven 包冲突的问题(maven helper)

日常开发中经常会遇到xxx.class 找不到的异常,但是这个类确实存在我们的项目中,就会感觉很离奇,其实这就是包冲突的问题 冲突问题 比如项目中引用了两个 fastjson.jar的版本,分别为 fastjson:1.2.28 fastjson:1.2.3 我们用到了1.2.28中的某个类, 比如 A类,在版本更新中 1.2.3版本去掉了这个类,然而我们项目中maven 却把1.2.3的 jar 打包进去了,那我们就会报异常,不存在这个 class,但是我们调错误的时候却发现这个类存在,那我们怎么找到问题根源呢,到底是哪个包的需要Exclude 呢,我之前也不会,今天有幸找到个方法,分享给大家。 idea 中maven 问题 idea 中查看 maven 依赖只会给你一个复杂到极点图,基本没有啥价值,所以要安装个插件 maven helper,这个插件用了都说好啊 解决问题 首先安装插件 maven helper(因为我已经安装了,所以没 install 的按钮了) 安装完成后,在 pom 文件下方会出现这个东西 点进去你会发现仿佛回到了 eclipse 接下来到重点了,选中冲突选项 conflicts,这一列都是存在冲突的包 以fastjson 为例 当然我们调错误的时候也可以直接搜索有问题的包,如下 选中右键就可以 Exclude 啦,想用1.2.28就把其他版本的Exclude掉,想用1.2.3就把其他版本的Exclude掉,是不是很方便。 --------------------- 版权声明:本文为CSDN博主「你是我的小眼睛儿」的原创文章,遵循CC 4.0 by-sa版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/sunpeng_sp/article/details/77393348

联系我们

联系电话

4000-640-466

联系邮箱

service@f-li.cn

办公地址

上海黄浦区外滩源1号

谢谢,您的信息已成功发送。
请填写信息。