数据库主键

MySQL 索引选择原则分析(一)

心已入冬 提交于 2019-11-29 17:02:51
目的 数据库中很重要的设计一部分,莫过于索引了。 B+树索引是 MySQL中设计的索引。B+树索引是基于B+树基础发展而来的。 然而,在理解了B+树索引结构以后,对优化SQL会事 半 功 倍 。还针对前面 MySQL索引选择规则 文章做进一步分析。 1:B+树 与 B+树索引 区别 B+树 B+树索引 存储位置 内存 磁盘 扇出率 低 高 并发控制 可以不考虑 需要考虑 分裂方向 不需要考虑 向左、向右 上图中列出两者的区别,光看图片可能不能理解每个区别对应的含义。 下面就来分析一下重要的区别: 1.1:存储位置: B+树 是为磁盘或其他直接存取辅助设备而设计的一种平衡查找树,因此主要操作是计算不需要文件来存储,也就是在内存来操作的。 B+树索引 是基于磁盘,因此数据库会出现索引文件,索引文件就是存储在磁盘上的。 1.2:分裂方向 B+树 是内存结构,不需要考虑页分裂的方向。 B+树索引 在磁盘上,为了充分利用磁盘的顺序特性,还需要根据不同插入情况考虑不同的分裂点记录以及分裂的方向。 2:MySQL的InnoDB存储引擎的索引设计 InnoDB存储引擎将B+树索引分为聚集索引和辅助索引。 聚集索引是通过将表的主键作为键值来构造B+树。如果没有显示创建,自动创建一个6字节的主键。聚集索引还包含记录所有列信息。 2.1:存储结构 聚集索引的非叶子点存放的是<键值, 地址>

SpringBoot@GeneratedValue 四种参数

人走茶凉 提交于 2019-11-29 14:35:18
按照大家学习SpringBoot的经验来看, SpringBoot的@GeneratedValue 是不需要加参数的,但是如果数据库控制主键自增(auto_increment), 不加参数就会报错.(血的教训, 看了@GeneratedValue源代码才知道) @GeneratedValue(strategy=GenerationType.IDENINY) PS:@GeneratedValue注解的strategy属性提供四种值: -AUTO主键由程序控制, 是默认选项 ,不设置就是这个 -IDENTITY 主键由数据库生成, 采用数据库自增长, Oracle不支持这种方式 -SEQUENCE 通过数据库的序列产生主键, MYSQL 不支持 -Table 提供特定的数据库产生主键, 该方式更有利于数据库的移植 参考地址 https://blog.csdn.net/ssjq123/article/details/79572016 来源: https://blog.csdn.net/weixin_44018338/article/details/100041981

JAVA生成唯一主键uuid的方法 (UUID方法)

你。 提交于 2019-11-29 14:33:57
在平时开发时,如果没有定义数据库自动生成ID的机制,可以使用java自带的uuid生成随机唯一主键,在插入数据库时,可以直接给ID主键赋值;这个uuid方法,在java自带的utils包里,就可以直接调用: 示例: public static String getUUID(){ UUID uuid=UUID.randomUUID(); String uuidStr=uuid.toString(); return uuidStr; } =======注意======= UUID随机主键的长度为36位,在数据库表设计时,注意为UUID存储列,分配足够的长度 参考地址 https://blog.csdn.net/weixin_42350212/article/details/80588471 来源: https://blog.csdn.net/weixin_44018338/article/details/100042270

大数据量时Mysql的优化要点

空扰寡人 提交于 2019-11-29 14:01:37
如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。 虽然关系型数据库在海量数据中逊色于NoSQL数据库,但是如果你操作正确,它的性能还是会满足你的需求的。针对数据的不同操作,其优化方向也是不尽相同。对于数据移植,查询和插入等操作,可以从不同的方向去考虑。而在优化的时候还需要考虑其他相关操作是否会产生影响。就比如你可以通过创建索引提高查询性能,但是这会导致插入数据的时候因为要建立更新索引导致插入性能降低,你是否可以接受这一降低那。所以,对数据库的优化是要考虑多个方向,寻找一个折衷的最佳方案。 一:查询优化 1:创建索引。 最简单也是最常用的优化就是查询。因为对于CRUD操作,read操作是占据了绝大部分的比例,所以read的性能基本上决定了应用的性能。对于查询性能最常用的就是创建索引。经过测试,2000万条记录,每条记录200字节两列varchar类型的

grails 设置一对多(hasMany belongsTo)级联关系

十年热恋 提交于 2019-11-29 13:59:46
Grails 是内嵌 Hibernate 来进行数据库交互的,级联关系也和 Hibernate 设置一致。常见情形在官方文档里已做了详细介绍,这里讨论的是一对多,而且 “一” 这一方的主键需要指定特定 column 的情形。一对一和 多对多 可以以此类推。有两个表 officer:用户表(由于历史等特殊原因命名此表),主键 user_id group_user:用户和用户组关系表,主键 group_id + user_id domain class 如下所示: class Officer { String userId static mapping = { id name: "userId", generator: "assigned" version false } } class GroupUser { String groupId String userId static mapping = { id composite: ["groupId", "userId"] version false } } 添加 级联关系后如下所示: class Officer { String userId static hasMany = [GroupUsers: GroupUser] static mapping = { id name: "userId", generator:

最全面的 MySQL 索引详解

 ̄綄美尐妖づ 提交于 2019-11-29 13:57:17
什么是索引? 1、索引 索引是表的目录,在查找内容之前可以先在目录中查找索引位置,以此快速定位查询数据。对于索引,会保存在额外的文件中。 2、 索引,是数据库中专门用于帮助用户快速查询数据的一种数据结构。类似于字典中的目录,查找字典内容时可以根据目录查找到数据的存放位置,然后直接获取即可。 索引由数据库中一列或多列组合而成,其作用是提高对表中数据的查询速度 索引的优点是可以提高检索数据的速度 索引的缺点是创建和维护索引需要耗费时间 索引可以提高查询速度,会减慢写入速度 索引分类 1.普通索引 2.唯一索引 3.全文索引 4.单列索引 5.多列索引 6.空间索引 7.主键索引 8.组合索引 普通索引:仅加速查询 唯一索引:加速查询 + 列值唯一(可以有null) 主键索引:加速查询 + 列值唯一 + 表中只有一个(不可以有null) 组合索引:多列值组成一个索引, 专门用于组合搜索,其效率大于索引合并 全文索引:对文本的内容进行分词,进行搜索 索引合并,使用多个单列索引组合搜索 覆盖索引,select的数据列只用从索引中就能够取得,不必读取数据行,换句话说查询列要被所建的索引覆盖 如何创建索引?记住一个单词—explain 创建表的时候创建索引 CREATE TABLE tbl_name( 字段名称 字段类型 [完整性约束条件], ,,,, [UNIQUE|FULLTEXT

Mysql干货

白昼怎懂夜的黑 提交于 2019-11-29 12:23:46
索引相关 关于MySQL的索引,曾经进行过一次总结,文章链接在这里 Mysql索引原理及其优化. 1. 什么是索引? 索引是一种数据结构,可以帮助我们快速的进行数据的查找. 2. 索引是个什么样的数据结构呢? 索引的数据结构和具体存储引擎的实现有关, 在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引. 3. Hash索引和B+树所有有什么区别或者说优劣呢? 首先要知道Hash索引和B+树索引的底层实现原理: hash索引底层就是hash表,进行查找时,调用一次hash函数就可以获取到相应的键值,之后进行回表查询获得实际数据. B+树底层实现是多路平衡查找树 .对于每一次的查询都是从根节点出发,查找到叶子节点方可以获得所查键值,然后根据查询判断是否需要回表查询数据. 那么可以看出他们有以下的不同: hash索引进行等值查询更快(一般情况下),但是却 无法进行范围查询 . 因为在hash索引中经过hash函数建立索引之后,索引的顺序与原顺序无法保持一致,不能支持范围查询.而B+树的的所有节点皆遵循(左节点小于父节点,右节点大于父节点,多叉树也类似),天然支持范围. hash索引不支持使用索引进行排序 ,原理同上. hash索引不支持模糊查询 以及多列索引的最左前缀匹配.原理也是因为hash函数的不可预测

【数据库】数据库入门(二): 关系型数据库

你说的曾经没有我的故事 提交于 2019-11-29 11:38:45
定义 属性(Attribute) : 表的每一列具有固定的属性类别。 如姓名(Name)、年龄(Age)、地址(Address)、电话号码(PhoneNumber)等。 域(Domain) : 每个属性所限定的数据类型及其取值范围。 常用的域有字符串(STRING)、日期(DATE)、整型数(INT)等。 元组(Tuple) : 表的每一行称为一个元组,用来标识一个实体,表中不能出现相同的两个元组。 单个元组的取值必然是所有域的笛卡尔积(Cartesian Product)的一个元素。 如 {'Sunday', ‘2019-08-02‘, 100} 是 {STRING, DATE, INT} 的一个元素。 关系(Relation) : 由行和列交错形成的二维表(Table),它表示一类数据关系。 单个二维表的取值必然是所有域的笛卡尔积(Cartesian Product)的一个子集。 关系模式(Relation Schema) : 定义的多个二维表及其包含的所有属性。 它包括表名和一系列的属性 每个属性都跟域相关联 ENROL(StudentID, CourseNo, Semester, Status, EnrolDate); ENROL(StudentID: INT, CourseNo: STRING, Semester: STRING, Status: STRING,

Mysql索引

走远了吗. 提交于 2019-11-29 10:12:50
Mysql 索引 A 、索引的基本操作 1 、概念 1 )、查看索引 show index from 数据库表名 2 )、 alter table 数据库表 add index 索引名称 ( 数据库表字段名称 ) 2 、索引类型: 1 )、 PRIMARY KEY (主键索引) ALTER TABLE table_name ADD PRIMARY KEY ( column ) 2 )、 UNIQUE( 唯一索引 ) ALTER TABLE table_name ADD UNIQUE (column) 3 )、 INDEX( 普通索引 ) ALTER TABLE table_name ADD INDEX index_name ( column ) 4 )、 FULLTEXT( 全文索引 ) ALTER TABLE table_name ADD FULLTEXT ( column ) 5 )、多列索引 ALTER TABLE table_name ADD INDEX index_name ( column1, column2, column3 ) 3 、操作 1). 普通索引。 这是最基本的索引,它没有任何限制。它有以下几种创建方式: ( 1 )创建索引: CREATE INDEX indexName ON tableName(tableColumns(length)); 如果是

MYSQL索引

二次信任 提交于 2019-11-29 08:56:41
mysql的4种常用索引类型:唯一索引,主键索引,全文索引,以及普通索引。 普通索引(INDEX):普通索引为索引的核心部分,无限制,目的就是加快数据的访问速度,而主键索引,唯一索引, 全文索引则是在普通索引延伸出来的有规则限制的索引,方便用于某些特定的业务场景。 主键索引(PRIMARY):可以理解主键(常用的那个id主键),每一张表都必须有一个主键,且不允许为空。 唯一索引(UNIQUE):内容具备唯一性,像手机号,身份证这种,可以用唯一索引,唯一索引允许内容为空 全文索引(FULLTEXT):用于文本文章匹配,适用于模糊搜索居多,模糊搜索时使用%xxx%和%xxx,索引是不起效的,唯有使用xxx%,索引才会起效果,适用字段类型,varbinary,text。 以上4种是常用的索引,接下来我们来看看其他的索引 如:单列索引,多列索引(也叫组合索引、联合索引、复合索引) 单列索引:即是一个表里就一个字段创建了索引 多个单列索引:即是根据需求在表里的多个字段里创建了多个索引 多列索引:则是根据需求在表中的多个字段里创建一个索引,创建时须考虑字段顺序,在使用中必须按照索引字段顺序使用,否则失效 索引的基本操作:增删改查 添加索引: 以下添加默认为添加单列索引 ALTER TABLE 表名 ADD INDEX 索引名称(字段名); 如:ALTER table cs ADD INDEX