首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

数据库避坑指南:MySQL里那些常见的错误设计规范,你中了几个?

但是如果选项值固定的情况,随着业务发展可能会增加,才推荐使用枚举字段。...索引个数限制 错误的设计规范:限制每张表上的索引数量,一张表的索引不能超过 5 个 MySQL 单表的索引没有个数限制,业务查询有具体需要,创建即可,不要迷信个数限制 子查询使用 错误的设计规范:避免使用查询...然而,MySQL 8.0 版本,子查询的优化得到大幅提升,所以在新版本的MySQL可以放心的使用查询。...即,在 MySQL 8.0 ,优化器会自动地将 IN 子查询优化,优化为最佳的 JOIN 执行计划,这样一来,会显著的提升性能。...5个,可以根据业务情况添加和删除 MySQL8 对子查询有了优化,可以放心使用

1K20

MySQL 8.0.23新特性 - 不可见列

这是第一篇关于这个新功能的文章,希望写一个3篇的系列。这是前言。 在MySQL 8.0.23之前,表中所有的列都是可见的(如果您有权限的话)。现在可以指定一个不可见的列,它将对查询隐藏。...| age | +----+-----+ | 1 | 25 | | 2 | 35 | | 3 | 44 | +----+-----+ 对这个新功能感到非常高兴,在下一篇文章我们将会看到为什么这对...本文是与MySQL不可见列相关的系列文章的第二部分。 这篇文章介绍了为什么不可见列对InnoDB存储引擎很重要。 首先,让简单解释一下InnoDB是如何处理主键的,以及为什么一个好的主键很重要。...如果是这样,您有两种方法: 分析所有的查询使用重写查询插件 使用不可见列 在这种情况下,选择是容易的(至少对像我这样的懒人说)。...使用组复制的要求之一是要有一个主键(这就是为什么可以使用sql_require_primary_key)。 我们使用上例重构表,不加主键,检查该实例能否作为InnoDB Cluster: ?

1.3K10
您找到你想要的搜索结果了吗?
是的
没有找到

Mysql 8.0 更好的支持了 UUID

实现的是版本1,由 时间戳、UUID版本、MAC地址构成 好处 MySQL使用 UUID 是对 AUTO_INCREMENT PRIMARY KEY的一个很好的替代,有如下好处: keys 在不同...的处理方法 MySQL8.0 新增了3个函数: UUID_TO_BIN BIN_TO_UUID IS_UUID 通过这3个函数,使我们可以更方便的应用UUID,并且是对上面提到的几点不足的一个解决方案...t (id binary(16) PRIMARY KEY); 插入 INSERT INTO t VALUES(UUID_TO_BIN(UUID())); 查询 SELECT BIN_TO_UUID(...id) FROM t; +--------------------------------------+ | BIN_TO_UUID(id); | +----------------------...852c-4439c456d444 | +--------------------------------------+ 通过压缩,很好的改善了存储空间过大的问题,但还存在性能问题,无序意味着要向索引树随机位置插入

4.7K110

听说过spring-data-jdbc么?来个最佳实践

它拥有了类似jpa的一些特性,比如能够根据方法名推导出sql,基本的CRUD等,也拥有了写原生sql的能力。 最为关键的是,它非常的清爽,不需要依赖hibernte或者jpa。...通过在h2里面指定MODE=MYSQL属性,就可以把h2切换到mysql的语法。虽然h2在项目实际运行感觉总是差那么一点意思,但对于测试来说,不得不说是个好工具。...2.2 根据方法名直接查询 有一段时间,使用jpa,可以直接根据规则写方法名,不用写任何SQL,就可以完成查询功能。这个现在在jdbc也有了。...代码的findByCode方法,意思就是根据code,来查询当前实体。...2.根据方法名查询 这个在参数比较少的时候,比较推荐,因为很清晰,也能在jpa之间进行切换。 3.使用Query 对于稍微复杂的sql,建议使用这种方式。

3.5K40

Spring-data-jpa(spring数据持久层解决规范)详解

2、我们都知道,在使用持久化工具的时候,一般都有一个对象来操作数据库,在原生的Hibernate叫做Session,在JPA叫做EntityManager,在MyBatis叫做SqlSession...总结一下使用动态查询:前面说的原生api需要4步,而使用spring-data-jpa只需要一步,那就是重写匿名内部类的toPredicate方法。...join t.clazz tt left join右边直接就是t的属性,并且也没有了on t.clazz_id == tt.id,然而并不会出现笛卡尔积,这里解释一下为什么没有这个条件,在我们的实体配置了属性的映射关系...in是主键,或者说是带有索引的,效率是很高的,mysql如果in是子查询貌似不会走索引,不过个人经验,在遇到的实际应用,in(ids)这种是比较多的,所以一般来说是没有性能问题的。   ...2、在多对多的查询,我们可以使用JPQL,也可以使用原生SQL,同时还可以使用动态查询,这里介绍多对多的动态查询,这里有一个条件比较苛刻,那就是查询参数是关联对象的属性,一对多类似,多对一可以利用上面介绍的级联获取属性的方式

2.9K20

SpringDataJPA 系列之 JPA 简介

1.1.2 为什么要有 ORM   当实现一个应用程序时(不使用 ORM),我们可能会写特别的代码,从数据库保存数据、修改数据、删除数据,而这些代码都是重复的,一个完整的系统要包含成千上万个这样重复的而又混杂的处理过程...MyBatis 可以使用简单的 XML 或注解来配置和映射原生信息,将接口和 Java 的 POJOs(Plain Ordinary Java Object,普通的 Java 对象)映射成数据库的记录...JPA 基于非侵入式原则设计,因此可以很容易的和其它框架或者容器集成 ☞ 查询能力   JPA查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是 Hibernate...可以理解为 JPA 规范的再次封装抽象,底层还是使用了 Hibernate 的 JPA 技术实现,引用 JPQL(Java Persistence Query Language) 查询语言,属于 Spring...注解 ☞ 常用注解 注解 说明 属性 @Entity 指定当前类是实体类 @Table 指定实体类和表之间的对应关系,指定则默认表名为类名全小写 name:指定数据库表的名称 @Id 指定当前字段是主键

4.3K20

持久层变化历史和Mybatis的到来

回过头来重新梳理一下几个基础框架 一 持久层的变迁历史 想一想,最原始的最初的持久层是jdbc,大二不会框架用了很久原生的.......那么如果在复杂业务,我们就会遇到一些问题 1.与业务无关的代码重复 2.手动管理连接,资源管理复杂 3.结果集封装复杂需要我们手动一一对应 4.sql与java语句写在一起,硬编码,很复杂麻烦...一些持久工具 比如dbutils,也不知道为什么当时一个2018年的人了还把这些老的玩意都用了一遍........,用过springdata jpa,估计这俩差不多 在我们再pojo里配置好@Entriy 以及@Table(name="XXX") 以及@id主键注解,这俩框架就会自动帮我们生成SQL 语句(屏蔽数据库的差异...@Entity//声明实体类 @Table(name = "tb_friend")//只要使用jpa就要指定实体类关联的数据库表 @IdClass(Friend.class) public class

28830

【原创】纯干货,Spring-data-jpa详解,全方位介绍。

2、我们都知道,在使用持久化工具的时候,一般都有一个对象来操作数据库,在原生的Hibernate叫做Session,在JPA叫做EntityManager,在MyBatis叫做SqlSession...总结一下使用动态查询:前面说的原生api需要4步,而使用spring-data-jpa只需要一步,那就是重写匿名内部类的toPredicate方法。...join t.clazz tt left join右边直接就是t的属性,并且也没有了on t.clazz_id == tt.id,然而并不会出现笛卡尔积,这里解释一下为什么没有这个条件,在我们的实体配置了属性的映射关系...in是主键,或者说是带有索引的,效率是很高的,mysql如果in是子查询貌似不会走索引,不过个人经验,在遇到的实际应用,in(ids)这种是比较多的,所以一般来说是没有性能问题的。   ...2、在多对多的查询,我们可以使用JPQL,也可以使用原生SQL,同时还可以使用动态查询,这里介绍多对多的动态查询,这里有一个条件比较苛刻,那就是查询参数是关联对象的属性,一对多类似,多对一可以利用上面介绍的级联获取属性的方式

1.8K10

Spring-data-JPA详细介绍,增删改查实现「建议收藏」

2、我们都知道,在使用持久化工具的时候,一般都有一个对象来操作数据库,在原生的Hibernate叫做Session,在JPA叫做EntityManager,在MyBatis叫做SqlSession...总结一下使用动态查询:前面说的原生api需要4步,而使用spring-data-jpa只需要一步,那就是重写匿名内部类的toPredicate方法。...left join t.clazz tt left join右边直接就是t的属性,并且也没有了on t.clazz_id == tt.id,然而并不会出现笛卡尔积,这里解释一下为什么没有这个条件,在我们的实体配置了属性的映射关系...in是主键,或者说是带有索引的,效率是很高的,mysql如果in是子查询貌似不会走索引,不过个人经验,在遇到的实际应用,in(ids)这种是比较多的,所以一般来说是没有性能问题的。   ...2、在多对多的查询,我们可以使用JPQL,也可以使用原生SQL,同时还可以使用动态查询,这里介绍多对多的动态查询,这里有一个条件比较苛刻,那就是查询参数是关联对象的属性,一对多类似,多对一可以利用上面介绍的级联获取属性的方式

2.2K30

浅谈几种常见的分布式ID

使用UUID值可能会导致性能问题,因为它们的大小和没有被排序。 ❖ 数据库案例:MySQLMySQL,就内置了对UUID的支持。在使用上需注意若干问题。...格式问题 在MySQL,可以使用UUID()来生成主键,但是用MySQL的UUID()函数 ,生成的UUID是36位的,其中包含32个字符以及4个分隔符(-),往往这个分隔符对我们来说是没有用的,可以使用...内置函数支持 在MySQL,可以以紧凑格式(BINARY)存储UUID值,并通过以下功能显示人机可读格式(VARCHAR):UUID_TO_BIN、BIN_TO_UUID、IS_UUID。...需要注意,UUID_TO_BIN(),BIN_TO_UUID()和IS_UUID()函数仅在MySQL 8.0或更高版本可用。...在下面的示例将自定义字母表定义为 ABCDEF1234567890,并将 Id 的大小定义为 12。

1.4K20

重学Springboot系列之整合数据库开发框架---上

你问我为什么这么配置,我会告诉你:这是乌龟的屁股—规定。为什么女人能生孩子,男人不行,你问我也不知道,就是这么安排的!谁这么安排的?女娲(JTA规范)安排的。...笔者在学习这两个框架的过程,看过不少的帖子,每当有帖子比较这两个框架的优缺点,就引来一场论战。从笔者的角度,为什么国内的开发人员或者开发团队较少使用JPA?...那么这是为什么呢?我们还要从JPA的特点说起: JPA对于单表的或者简单的SQL查询非常友好,甚至可以说非常智能。他为你准备好了大量的拿来即用的持久层操作方法。...但是,JPA对于多表关联查询以及动态SQL、自定义SQL等非常不友好。对于JPA来说,一种实现实现方式是QueryDSL,实现的代码是下面这样的。想问:你希望用这样的代码代替SQL么?...程序员特别排斥几件事: 将复杂关联关系的SQL写在java代码里面,拼串书写不方便 SQL是最能表达实体关系查询的语言,程序员希望使用异化SQL语言。

75130

Spring 全家桶之 Spring Data JPA(一)

)); return user; } } JdbcTemplate虽然简化了原生jdbc的操作,封装了获取数据库连接,创建prepareStatment对象等操作,但是仍然需要在代码写入...高级特性    JPA 能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化...三、如何使用JPA API 3.1 - 基本增删改查实现 创建Customer实体类对应的数据库表customer CREATE TABLE customer ( cust_id bigint(32...在test包创建类CustomerDaoTest,使用Junit进行JPA测试 ``` java public class CustomerDaoTest { @Test public...JPQL全称Java Persistence Query Language 基于首次在EJB2.0引入的EJB查询语言(EJB QL),Java持久化查询语言(JPQL)是一种可移植的查询语言,旨在以面向对象表达式语言的表达式

1.4K20

干货|一文读懂 Spring Data Jpa

其实这个话题松哥以前零零散散的介绍过,在的书里也有介绍过,但是在公众号还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring Data 和 Jpa! 故事的主角 Jpa 1....主角的故事 Jpa 的故事 为了让大伙彻底把这两个东西学会,这里就先来介绍单纯的Jpa使用,然后我们再结合 Spring Data 来看 Jpa如何使用。...select 用来指定查询返回的结果实体或实体的某些属性。 from 子句声明查询源实体类,并指定标识符变量(相当于SQL表的别名)。 如果希望返回重复实体,可使用关键字 distinct 修饰。...3.查询方法流程解析 为什么写上方法名,JPA就知道你想干嘛了呢?...(@Param("name") String name, @Param("id") Long id); 查询时候,也可以是使用原生的SQL查询,如下: @Query(value = "select *

2.8K20

SpringBoot教程(十二) | SpringBoot集成JPA

查询能力 JPA查询语言是面向对象而非面向数据库的,它以面向对象的自然语法构造查询语句,可以看成是Hibernate HQL的等价物。...高级特性 JPA 能够支持面向对象的高级特性,如类之间的继承、多态和类之间的复杂关系,这样的支持能够让开发者最大限度的使用面向对象的模型设计企业应用,而不需要自行处理这些特性在关系数据库的持久化。...SpringDataJpa是Spring提供的一套简化JPA开发的框架,按照约定好的方法命名规则来创建DAO层接口,就可以在写接口实现的情况下,实现对数据库的访问和操作。...SpringDataJpa可以理解为JPA规范的再次封装抽象,底层还是使用了Hibernate的Jpa技术实现。 4....application.yml配置数据库相关信息: spring: datasource: driver-class-name: com.mysql.cj.jdbc.Driver

2.5K10

「拥抱开源」从零开始 Docker、Mysql & JPA

为了降低项目成本,我们有一套完整的 MySQL 开源社区版集群。希望能在低成本的基础上,带来期望的收益。 然而,经过不停的填坑操作告诉我们一个道理。...所以,现在选用“建立映射目录”的方式运行。也就是,存储数据会丢失。 使用 Navicat 配置 MySQL 的访问方式。 创建一个 utf8 编码格式的数据库 oPos。...在商业运用,大量的 SQL 查询需要手动干预进行优化。 虽然,有更优秀的操作数据库的解决方案。但是,JPA 真的就没有优点了吗? 答案当然是:也不知道。...JPA 特别适合中小型项目,它能帮助后端开发工程师更好的理解数据设计,让后端开发工程师把更多的时间、精力放在代码设计与优化之上。 至于 SQL 查询的销量,就让 JPA 自身优化去吧。...UscGuideEntity 使用了大量的 javax.persistence.* 注解进行修饰,这样的目的是在应用启动的过程,程序会主动的像数据库创建指定的表。 /** * usc_guide

64420

Spring Boot2 系列教程(二十三)理解 Spring Data Jpa

其实这个话题松哥以前零零散散的介绍过,在的书里也有介绍过,但是在公众号还没和大伙聊过,因此本文就和大家来仔细聊聊 Spring Data 和 Jpa! 本文大纲: ? 1....主角的故事 2.1 Jpa 的故事 为了让大伙彻底把这两个东西学会,这里就先来介绍单纯的 Jpa 使用,然后我们再结合 Spring Data 来看 Jpa 如何使用。...select 用来指定查询返回的结果实体或实体的某些属性。 from 子句声明查询源实体类,并指定标识符变量(相当于SQL表的别名)。 如果希望返回重复实体,可使用关键字 distinct 修饰。...2.2.3.3 查询方法流程解析 为什么写上方法名,JPA就知道你想干嘛了呢?...(@Param("name") String name, @Param("id") Long id); 查询时候,也可以是使用原生的 SQL 查询,如下: @Query(value = "select

2K10

SpringBoot@Transaction在不同MySQL引擎下的差异性

."); } 实际测试的时候发现,事务回滚并没有效果,数据已经插入到DB: 搜索了下,发现有人提到说MySQL数据库的事务生效,可能和引擎类型有关系,因此下一步往这个方向排查一下。...查看MySQL数据表的引擎类型 通过show create table TABLE_NAME命令查看MySQL数据表对应的引擎类型,查询结果如下所示: Table Create Table TestTable...修改JPA自动创建表时的引擎 测试工程使用的是JPA自动创建数据表的方式,默认情况下,创建出来数据表使用的是MyISAM引擎,因此如果需要使用事务,可以手动配置下,指定使用InnoDB引擎进行创建数据表...为什么事务对MyISAM引擎生效呢 为什么Spring的事务无法控制MySQL的MyISAM引擎类型数据表操作呢?...只有在executeSave方法执行完成跳出此方法之后,即执行到调用逻辑return ""语句的时候,数据库才能查询到记录。

99920

使用JPA原生SQL查询绑定实体的情况下检索数据

在这篇博客文章将与大家分享在学习过程编写的JPA原生SQL查询代码。这段代码演示了如何使用JPA进行数据库查询,而无需将数据绑定到实体对象。...然而,在某些情况下,你可能希望直接使用SQL执行复杂查询,以获得更好的控制和性能。本文将引导你通过使用JPA原生SQL查询来构建和执行查询,从而从数据库检索数据。...场景设置假设你有这样一个场景:你需要从名为UserPowerSelectorType的表检索数据。我们将创建一个SQL查询,以使用JPA原生SQL查询功能从这个表检索特定数据。...然后,将这些值存储在querySelectDepotId列表。总结恭喜你!你已经学会了如何在JPA构建和执行原生SQL查询,以从数据库检索数据。...在需要执行复杂查询且标准JPA映射结构不适用的情况下,这项知识将非常有用。欢迎进一步尝试JPA原生查询,探索各种查询选项,并优化查询以获得更好的性能。

49230
领券