日常开发mysql 和 mogo❣️示例代码
一、mysql
1.1 建表语句(含索引)
CREATE TABLE `admin_bu` (
`id` BIGINT(20) NOT NULL AUTO_INCREMENT,
`admin_bu_open_id` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '分布式id',
`name` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '事业部名称',
`memo` VARCHAR(200) NOT NULL DEFAULT '' COMMENT '备注',
`status` TINYINT(4) NOT NULL DEFAULT '0' COMMENT '状态1有效0无效',
`create_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_date` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
`create_by` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '创建人',
`update_by` VARCHAR(50) NOT NULL DEFAULT '' COMMENT '更新人',
PRIMARY KEY (`id`) USING BTREE,
KEY `idx_admin_bu_open_id` (`admin_bu_open_id`)
) ENGINE=INNODB AUTO_INCREMENT=29 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='事业部表';
根据表生成代码在 ota-service
1.2 mysql把一个字段的值复制到另一个字段
update mytable set colA = colB where ...
UPDATE admin_branch SET admin_branch_open_id = branch_id;
UPDATE car_dim_branch SET admin_branch_open_id = branch_id WHERE branch_id =49;
1.3 查询表某个字段重复数据
select * from asset_warning_record
group by zrw_id having count(1)>1
1.4 表新增[修改]【删除】字段且设置默认值
ALTER TABLE car_driver_daily_health_survey ADD health_code_photo VARCHAR(255) DEFAULT '' AFTER body_temperature;
ALTER TABLE REPORT_DOWNLOAD_MANAGE ADD `early_alarm_id` VARCHAR(255) DEFAULT '' COMMENT '场景化预警事件ID';
-- 修改字段
ALTER TABLE asset_wms_license MODIFY COLUMN operating_type TINYINT NOT NULL DEFAULT 0 COMMENT '营运性质(1:营运2:非营运)';
ALTER TABLE asset_wms_license MODIFY COLUMN first_regist_time VARCHAR(30) NOT NULL DEFAULT '' COMMENT '首次注册日期';
-- 删除字段
ALTER TABLE VEHICLE_SIM DROP column simstatus;
-- 删除外键依赖
ALTER TABLE `OTA_TASK` DROP FOREIGN KEY `FK_OTA_TASK_MODEL_ID`;
1.5 查询sql执行EXPLAIN
EXPLAIN + sql
例如:EXPLAIN SELECT * FROM sso_user WHERE sso_user.status = 1
关注点:
● key:显示MySQL实际决定使用的键(索引)。如果没有选择索引,键是NULL
● rows: 显示MySQL认为它执行查询时必须检查的行数
● type结果
system > const > eq_ref > ref > fulltext > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
all:全表扫描
一般来说,得保证查询至少达到range级别,最好能达到ref,type出现index和all时,表示走的是全表扫描没有走索引,效率低下,这时需要对sql进行调优。
参考:
二、mongo
2.1 客户端
// 查询字段不为空
db.ev_remote_send_cmd_history.find({"feedbackSignals":{"$ne":null}});
db.regulationRule.find({cityName:{$in:["芜湖","绍兴"]}})
db.dtc_fault_upload_data.find({"uploadTime":{"$gt":ISODate("2021-09-28T00:00:22.474+08:00")}})
db.dtc_fault_upload_data.find({"uploadTime":{"$lt":ISODate("2021-09-28T00:00:22.474+08:00")}})
db.dtc_fault_upload_data.find({})
db.dtc_fault_upload_data.find({"$and":[{"uploadTime":{"$gt":ISODate("2021-09-26T00:15:22.474+08:00")}},
{"uploadTime":{"$lt":ISODate("2021-09-28T00:00:22.474+08:00")}}]})
db.dtc_fault_upload_data.find({"vin":"vin123"})
db.dtc_fault_upload_data.find({"$and":[{"uploadTime":{"$gt":1632585622000}},
{"uploadTime":{"$lt":1632672022000}}]})
倒叙排列
db.dtc_fault_upload_data.find({"vin":"JH11TESTVINYD0003"}).sort({"uploadTime":-1})
.limit(5)
2.2 修改代码
// 更新
public void updateModelName(String id,String modelName){
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(id));
Update update = new Update();
update.set("modelName", modelName);
mongoTemplate.updateFirst(query,update, Constant.TERMINAL_LOG);
}
// 批量修改
Query query = new Query(new Criteria().and("platformUniqueCode").nin(platformUniqueCodeList));
Update update = new Update();
update.set("status", status);
update.set("updateDate", new Date());
mongoTemplate.updateMulti(query, update, RegulationRecord.class);
2.3 查询代码
// 条件查询
// 分页
public List getTerminalLogList(String logType, String vin, Page page) {
Query query = new Query();
Criteria criteria = new Criteria();
if (StringUtils.isNotBlank(logType)) {
if(logType.equals(LogType.CAN.getKey())){
criteria.and("logType").is(LogType.CAN.getValue());
}else if(logType.equals(LogType.TBOX.getKey())){
criteria.and("logType").is(LogType.TBOX.getValue());
}
}
if (StringUtils.isNotBlank(vin)) {
Pattern pattern = Pattern.compile("^.*" + vin + ".*$", Pattern.CASE_INSENSITIVE);
criteria.andOperator(Criteria.where("vin").regex(pattern)) ;
}
Sort sort = new Sort(Sort.Direction.DESC, "createdTime");
query.with(sort);
query.addCriteria(criteria);
Long totalCount = null;
if (page != null) {
query.with(new PageRequest(page.getPageIndex().intValue() - 1, page.getPageSize().intValue()));
totalCount = mongoTemplate.count(query, TerminalLog.class, TerminalLogConstants.TERMINAL_LOG);
}
List terminalLogs = mongoTemplate.find(query, TerminalLog.class, TerminalLogConstants.TERMINAL_LOG);
for (TerminalLog terminalLog : terminalLogs) {
terminalLog.setDays(countDays(terminalLog.getSendTime()));
}
page.setTotalCount(totalCount);
return terminalLogs;
}
// 时间条件
if (StringUtils.isNotBlank(violationRecordPageListDTO.getBeginDate()) && StringUtils.isNotBlank(violationRecordPageListDTO.getEndDate())) {
criteria.andOperator(
Criteria.where("violationDate").gte(beginDate),
Criteria.where("violationDate").lte(endDate));
} else if(StringUtils.isBlank(violationRecordPageListDTO.getBeginDate()) && StringUtils.isNotBlank(violationRecordPageListDTO.getEndDate())){
criteria.and("violationDate").lte(endDate);
} else if(StringUtils.isNotBlank(violationRecordPageListDTO.getBeginDate()) && StringUtils.isBlank(violationRecordPageListDTO.getEndDate())){
criteria.and("violationDate").gte(beginDate);
}
2.4 索引相关
创建索引
db.col.createIndex({"title":1})
db.集合名.createIndex( {"字段名": 1 },{"name":'idx_字段名'})
注意在 3.0.0 版本前创建索引方法为 db.collection.ensureIndex(),之后的版本使用了 db.collection.createIndex() 方法,ensureIndex() 还能用,但只是 createIndex() 的别名。
SHOW INDEX FROM admin_bu;
ALTER TABLE admin_bu ADD INDEX idx_admin_bu_open_id (admin_bu_open_id) ;
// 删除索引
alter table admin_bu drop index idx_admin_bu_open_id;
SHOW INDEX FROM car_dim_branch;
DROP INDEX idx_admin_branch_open_id ON car_dim_branch;
ALTER TABLE car_dim_branch ADD UNIQUE INDEX `uk_admin_branch_open_id` (admin_branch_open_id);