1、关系型MySQL在互联网行业广泛使用,目前主流版本有5.7.x和8.0.x,企业使用5.7.x的较多一些,8.0.x性能提升较高,逐渐有很多公司用起来8.0.x版本了。本文以mysql5.7.29版本总结。依持久层框架如MyBatis/MyBatisPlus、JPA、Hibernate、JdbcTemplate等都对原始JDBC操作MySQL实现增删改差都提供了高度封装,上述框架也是目前企业开发使用最多的了。
2、Java连接MySQL的驱动选择:(mysql5.7的版本是可以兼容)
①:直接使用mysql-connector-java 5.1.x版本即可,驱动名称:com.mysql.jdbc.Driver,以及配置Druid连接池参数等。
mysql
mysql-connector-java
5.1.47
②:使用mysql -connector-java 8.0.x版本(5.1.x版本存在高危安全漏洞,看公司的安全规范了,)
驱动名称:com.mysql.cj.jdbc.Driver.
连接url:url: jdbc:mysql://127.0.0.1:3306/database?useUnicode=true&characterEncoding=utf8&serverTimezone=GMT%2B8(使用mysql8的驱动必须要指定时区,否则连接报错!)
注意时区问题:
serverTimezone=GMT%2B8
北京时间东八区
serverTimezone=UTC
UTC代表的是全球标准时间 ,但是我们使用的时间是北京时区也就是东八区,领先UTC八个小时。比如使用UTC时间,我们在Java代码中指定了时间,但是插入到数据库后的时间要少了8小时,因此我们直接采用东八区时间即可。
mysql
mysql-connector-java
8.0.20
③:如果考虑到软件权限License,也可以使用mariaDB(mysql的一个分支版本),测试兼容mysql5.7.x的。
驱动名称:org.mariadb.jdbc.Driver
连接URL:jdbc:mariadb://localhost:3306/XXX
org.mariadb.jdbc
mariadb-java-client
2.6.0
3、配置命令部分(不涉及常用的增删改查)
①:查看mysql版本
select version();
②:mysql字符集查看
mysql数据库字符集包括字符集和校对规则两个概念,字符集定义mysql字符串的存储方式,校对规则则是定义比较字符串的方式。
常用字符集包括:GBK、UTF8、UTF8mp4。GBK占用2个字节,UTF8占3个字节,UTF8mp4是UTF8的超集,占用4个字节,mysql8版本已默认为UTF8mp4了。建议UTF8mp4,这里全部改为UTF8mp4。解决常见讨厌的中文乱码问题!
配置文件[mysqld]下面修改:character-set-server=utf8mp4。[mysql] 用于配置客户端参数 。
3、mysql的连接数查看
show variables like 'max_connections';(默认是151个),线上根据业务情况设置,并不是越大越好,尽量降低事务占用连接的耗时,减低连接持有时间。
4、mysql表碎片查看
mysql表碎片产生原因:mysql删除数据不是真正意义上的物理删除(删除完数据就释放表空间),是修改标志位的逻辑删除方式,只是将数据文件的标志位删除了,也没有整理数据文件,因此不会彻底释放表空间的,删除数据后的表空间后面,就会留下碎片,重复插入数据的部分效率要比正常存储空间低一些。
计算常用公式:
碎片大小=数据总大小-实际表空间大小
实际表空间大小=数据大小(data_length)+索引大小(index_length)
实际表空间大小文件大小=rows*avg_row_length
show table status like '%user%'\G(单位是B,转换MB方式/1024/1024)
5、mysql的表的自增ID
①:创建表指定自增ID(无符号整型最大占:4字节,最大2^32-1=4294967295)
图片来自菜鸟教程mysql
create table `test1` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4294967294;
②:查看指定表的自增ID的SQL如下:
SELECT `AUTO_INCREMENT`
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_SCHEMA = '指定数据库'
AND TABLE_NAME = '指定数据表';
1.如果插入数据时id字段指定为0、null或未指定值,那么就把这个表当前的AUTO_INCREMENT值填到自增字段
当如果某次要插入的值是X,当前的自增值是Y时:
1.如果X 2、如果X>=Y,就需要把当前自增值修改为新的自增值;(结合上一张图对比哈) ③:查看mysql的自增步长和初始值 ④:自增值主键用完了后会报主键冲突。 原因:InnoDB指定了表自增主键后再插入数据的时候会获取当前插入表的自增主键,第一个insert语句插入数据成功后,这个表的AUTO_INCREMENT没有改变(还是4294967295),就导致了第二个insert语句又拿到相同的自增id值,再试图执行插入语句,报主键冲突错误。 ⑤:mysql自增ID不连续,只是递增的 1、唯一键冲突 2、事务回滚得方式 待续,未完 SHOW VARIABLES LIKE 'auto_inc%';