一、核心技术
1.常见日期格式
date和datetime类型区别
区别1:
①date类型可用于需要一个日期值而不需要时间部分时;
②datetime类型:可用于需要同时包含日期和时间信息的值。
区别2:
①date:MySQL 以 ‘YYYY-MM-DD’ 格式检索与显示date值;
②datetime:MySQL 以 'YYYY-MM-DD HH:mm:ss’格式检索与显示 DATETIME 类型。
区别3:
①date类型:支持的范围是 ‘1000-01-01’ 到’9999-12-31’;
②datetime类型:支持的范围是’1000-01-0100:00:00’ 到 ‘9999-12-3123:59:59’。
2.mysql驱动版本对比
老版本驱动,一般指5.x版本:
driverClassName: com.mysql.jdbc.Driver
新版本驱动,一般指8.x版本:
driverClassName: com.mysql.cj.jdbc.Driver
总结:使用mysql数据库,代码中使用的数据库版本要和数据库服务版本保持一致,并且数据库驱动准确无误才可以正常创建连接
mysql中in 和exists 区别。
exists:
exists对外表用loop逐条查询,每次查询都会查看exists的条件语句,当 exists里的条件语句能够返回记录行时(无论记录行是的多少,只要能返回),条件就为真,返回当前loop到的这条记录,反之如果exists里的条 件语句不能返回记录行,则当前loop到的这条记录被丢弃,exists的条件就像一个bool条件,当能返回结果集则为true,不能返回结果集则为 false
not exists:
not exists与exists相反,也就是当exists条件有结果集返回时,loop到的记录将被丢弃,否则将loop到的记录加入结果集
in
in是把外表和内表做hash连接,先查询内表,再把内表结果与外表匹配,对外表使用索引(外表效率高,可用大表),而内表多大都需要查询,不可避免,故外表大的使用in,可加快效率。
@see MySQL中exists和in的区别及使用场景 https://www.cnblogs.com/xiaoxiong-kankan/p/7928153.html
思考
1.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 ID 是几?
6
一般情况下,我们创建的表的类型是InnoDB,如果新增一条记录(不重启mysql的情况下),这条记录的id是8;但是如果重启(上文中提到的)MySQL的话,这条记录的ID是5。因为InnoDB表只把自增主键的最大ID记录到内存中,所以重启数据库或者对表OPTIMIZE操作,都会使最大ID丢失。
但是,如果我们使用表的类型是MylSAM,那么这条记录的ID就是8。因为MylSAM表会把自增主键的最大ID记录到数据文件里面,重启MYSQL后,自增主键的最大ID也不会丢失。
@see Java面试题(四):数据库 https://www.jianshu.com/p/4ff8add187a4
2. limit深度分页问题
普通的limit m,n,m表示偏移量,n表示返回条数,当m偏移量很大时,就需要扫描过多的表数据,例如limit 1000000,100,查询就需要扫描1000100条,然后舍弃掉不符合条件的前1000000条,效率自然也就低了。
我们大概有3种方式来解决limit分页慢的问题,请根据自己的数据量和业务需求进行选择:
1、id连续的情况下,直接用where id>500的方式来解决
2、id不连续的情况下,使用select id from test limit 5000000,1来获取limit起始值,但是实际测试发现效果不大
3、id不连续的情况下,新建一个order_no字段用来计算起始值,效率很高,但是需要解决order_no更新的问题
4、限制查询页数
参考:数据量大时limit分页慢的问题https://www.jianshu.com/p/b40852891fb0
二、sql运维
1.SELECT结果直接INSERT
INSERT INTO `table1`(`Column1`,`Column2`,`Column3`)
SELECT t2.Column1,t2.Column2,t2.Column3 FROM `table2` t2 WHERE XXX;
例子
INSERT INTO `sys_i18n` ( `business_type`, `language`, `i18n_key`, `i18n_value`, `remark`, `version`, `is_deleted`, `create_by`, `create_time`, `update_by`, `update_time` )
SELECT
'general' AS `business_type`,
`language`,
`i18n_key`,
`i18n_value`,
'从客诉导入' AS `remark`,
`version`,
`is_deleted`,
`create_by`,
`create_time`,
`update_by`,
`update_time`
FROM
`cpgroup_shrimp_scm`.`cp_shrimp_sys_i18n`
WHERE
`i18n_key` IN ( 'i18n.general.onlyExcelIsSupported', 'i18n.general.excelTemplateFormatIsIncorrect', 'i18n.excelImport.disposalErrorMsg1', 'i18n.general.missRequiredParams' );
参考文献
1.mysql中文官网 https://www.mysqlzh.com/
1.oracle中if/else功能的实现的3种写法 https://www.cnblogs.com/yangzhilong/archive/2013/04/03/2998282.html