日常开发踩坑汇总

106 阅读2分钟

Mysql唯一键约束不考虑大小写和前后空格

image.png MySQL的唯一键约束不考虑大小写和前后空格。因此,在插入或更新数据时,如果违反了唯一键约束,MySQL会抛出DuplicateKeyException异常。

举个例子,假设在一个表中有一个唯一键约束,列名为"username"。如果已经存在一个记录的username.为"test",那么再次插入或更新一个username为"Test"或"test"的记录时,都会触发唯一键约束的错误,抛出DuplicateKeyException异常。

如果希望进行大小写敏感的唯一键约束,可以在创建表时使用COLLATE关键字指定特定的字符集和排序规则。例如,可以使用COLLATE utf8_bin来实现大小写敏感的唯一键约束。

CREATE TABLE my_table {
    id INT PRIMARY KEY AUTO_INCREMENT,
    username VARCHAR(255) COLLATE utf8_bin UNIQUE,
    ...
}

此时再去插入与表中test不一致的Test值是就不会有问题。

多数据源配置

  1. nacos配置多数据源,默认使用dataSourceDefault数据源
spring:
  datasource:
    dynamic:
      primary: dataSourceDefault
      datasource:
        dataSourceDefault:
            username: 数据库名称1
            password: 数据库密码1
            url: 数据库url地址1
            driver-class-name: com.mysql.cj.jdbc.Driver
            type: com.zaxxer.hikari.HikariDataSource
            hikari:
              min-idle: 5
              max-pool-size: 15
              is-auto-commit: true
              idle-timeout: 600000
              pool-name: HikariCP
              max-lifetime: 28740000
        dataSourceHolo:
            username: 数据库名称2
            password: 数据库密码2
            url: 数据库url地址2
            driver-class-name: com.mysql.cj.jdbc.Driver

2. 添加依赖:

<!-- 动态数据源 -->
<dependency>
    <groupId>com.baomidou</groupId>
    <artifactId>dynamic-datasource-spring-boot-starter</artifactId>
    <version>3.5.1</version>
</dependency>

3. 在对应的使用其他数据源的地方添加注解@DS("xxx")

@Component
@DS("dataSourceHolo")
public interface VoucherOperateLogMapper extends BaseMapper<VoucherOperateLog> {

}

4. 测试结果

在user服务添加dev-bdw-cms数据库,成功获取到数据

MySQL深分页及解决方案

在实际应用中,我们经常需要对数据进行分页查询。然而,当我们尝试获取数据的后几页时,MySQL的性能可能会大幅度下降。这就是MySQL的深分页问题。原因在于MySQL在查询结果中跳过大量行时需要花费大量时间。例如,如果我们想获取第10000页的数据,MySQL需要先读取并跳过前9999页的数据,这将消耗大量时间。

解决方案:记录上次查询的位置

在进行分页查询时,我们可以记录上次查询的最后一个ID,然后在下次查询时,直接从这个ID开始查询,避免检索起始位置之前的数据。例如:

SELECT * FROM table WHERE id > last_id ORDER BY id LIMIT 10;