Mysql保持数据一致性的方法:加事务;mq补偿
https://blog.51cto.com/toren/5427075
https://blog.csdn.net/wangchengming1/article/details/120409137
mlysql幂等是啥
set @@session.sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION';
设置严格模式'ONLY_FULL_GROUP_BY时:
有group by时,不能select 聚合列(group by的列)以外的列,单独select聚合函数avg(),sum(),count(),min(),max()时,不能同时select任何列
"Out of sort memory error " has an inconsistent relationship with the buffer size
mysql版本 8.0.29 排序缓冲大小256k -> 1M,并且改为内存里排序,可以解决存的json字段太大导致排序失败查出空的错误;
内存排序实现sort方法
type Uint64Slice []uint64
func (p Uint64Slice) Len() int { return len(p) }
func (p Uint64Slice) Less(i, j int) bool { return p[i] < p[j] }
func (p Uint64Slice) Swap(i, j int) { p[i], p[j] = p[j], p[i] }
sort.Sort(utils.Uint64Slice(userIdList))
当前读和快照读 https://juejin.cn/post/7001357238648438821
mvcc https://juejin.cn/post/7001792991073402916
b树和b+树及红黑树的区别 https://www.jianshu.com/p/ace3cd6526c4
-- 创建一个存储过程
DROP PROCEDURE IF EXISTS PixsoWebAddColumnUnlessExists;
CREATE PROCEDURE PixsoWebAddColumnUnlessExists(
IN tableName tinytext,
IN fieldName tinytext,
IN fieldDef text)
BEGIN
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = fieldName
AND table_name = tableName
AND table_schema = database()
)
THEN
SET @ddl = CONCAT('ALTER TABLE ', tableName, ' ADD COLUMN ', fieldName, ' ', fieldDef, ';');
PREPARE stmt FROM @ddl;
EXECUTE stmt;
END IF;
END;
-- 创建一个存储过程
DROP PROCEDURE IF EXISTS Temp_20230211_DDL_user_view_menu;
CREATE PROCEDURE Temp_20230211_DDL_user_view_menu()
BEGIN
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'plugin_dock'
AND table_name = 'user_view_menu'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `user_view_menu`
ADD `plugin_dock` json NULL COMMENT '程序坞属性';
END IF;
END;
-- 使用方法
CALL Temp_20230211_DDL_user_view_menu();
-- 不再需要可删除
DROP PROCEDURE Temp_20230211_DDL_user_view_menu;
-- 创建一个存储过程
DROP PROCEDURE IF EXISTS Temp_20221207_DDL_person_folder;
CREATE PROCEDURE Temp_20221207_DDL_person_folder()
BEGIN
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'type'
AND table_name = 'role_team'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `role_team`
ADD COLUMN `type` smallint NOT NULL DEFAULT 1 COMMENT '团队类型;1:普通团队;2我的草稿';
END IF;
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'type'
AND table_name = 'role_folder'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `role_folder`
ADD COLUMN `type` smallint NOT NULL DEFAULT 1 COMMENT '项目类型;1:普通项目;2:草稿下的项目';
END IF;
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'type'
AND table_name = 'folder'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `folder`
ADD COLUMN `type` smallint NOT NULL DEFAULT 1 COMMENT '项目类型;1:普通项目;2:草稿下的项目';
END IF;
UPDATE `role_team` ,`team` SET `role_team`.`type`=2 WHERE `role_team`.`team_id`=`team`.`id` AND `team`.`name` = '' ;
UPDATE `folder` ,`team` SET `folder`.`type`=2 WHERE `folder`.`team_id`=`team`.`id` AND `team`.`name`='' ;
UPDATE `role_folder` ,`folder` SET `role_folder`.`type` = `folder`.`type` WHERE `role_folder`.`folder_id`=`folder`.`id` AND `folder`.`type`=2;
END;
-- 使用方法
CALL Temp_20221207_DDL_person_folder();
-- 不再需要可删除
DROP PROCEDURE Temp_20221207_DDL_person_folder;
-- 创建一个存储过程
DROP PROCEDURE IF EXISTS Temp_20221202_DDL_team;
CREATE PROCEDURE Temp_20221202_DDL_team()
BEGIN
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'avatar_status'
AND table_name = 'team'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `team`
ADD COLUMN `avatar_status` VARCHAR(16) NOT NULL DEFAULT 'pass' COMMENT '团队头像审核状态';
END IF;
END;
-- 使用方法
CALL Temp_20221202_DDL_team();
-- 不再需要可删除
DROP PROCEDURE Temp_20221202_DDL_team;
DROP PROCEDURE IF EXISTS del_index;
-- 创建一个存储过程
DROP PROCEDURE IF EXISTS Temp_20230210_DDL_plugin;
CREATE PROCEDURE Temp_20230210_DDL_plugin()
BEGIN
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'set_panel_cover'
AND table_name = 'plugin_audit'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `plugin_audit`
ADD `set_panel_cover` int DEFAULT 0 NOT NULL COMMENT '插件面板是否增加配图' AFTER `summary`;
END IF;
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'set_panel_cover'
AND table_name = 'plugin'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `plugin`
ADD `set_panel_cover` int DEFAULT 0 NOT NULL COMMENT '插件面板是否增加配图' AFTER `summary`;
END IF;
END;
-- 使用方法
CALL Temp_20230210_DDL_plugin();
-- 不再需要可删除
DROP PROCEDURE Temp_20230210_DDL_plugin;
-- 创建一个存储过程
DROP PROCEDURE IF EXISTS Temp_20230111_DDL_plugin_tag_meta;
CREATE PROCEDURE Temp_20230111_DDL_plugin_tag_meta()
BEGIN
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'translation'
AND table_name = 'plugin_tag_meta'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `plugin_tag_meta`
ADD `translation` json NULL COMMENT '多语言翻译';
END IF;
END;
-- 使用方法
CALL Temp_20230111_DDL_plugin_tag_meta();
-- 不再需要可删除
DROP PROCEDURE Temp_20230111_DDL_plugin_tag_meta;
-- 创建删除索引的存储过程
DROP PROCEDURE IF EXISTS del_index;
CREATE PROCEDURE del_index(IN target_table_name VARCHAR(100),IN target_index_name VARCHAR(100))
BEGIN
IF EXISTS (SELECT * FROM information_schema.statistics WHERE table_schema = DATABASE() AND table_name = target_table_name AND index_name = target_index_name) THEN
set @statement =( select concat ('alter table ',target_table_name, ' drop key ',target_index_name ));
PREPARE STMT FROM @statement;
EXECUTE STMT;
END IF;
END;
call del_index('tag','name');
call del_index('tag','idx_name_ttype');
-- 创建一个存储过程
DROP PROCEDURE IF EXISTS Temp_20230102_DDL_tag;
CREATE PROCEDURE Temp_20230102_DDL_tag()
BEGIN
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'translation'
AND table_name = 'tag'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `tag`
ADD `translation` json NULL COMMENT '多语言翻译';
END IF;
IF NOT EXISTS(
SELECT *
FROM information_schema.COLUMNS
WHERE column_name = 'position'
AND table_name = 'tag'
AND table_schema = DATABASE()
)
THEN
ALTER TABLE `tag`
ADD `position` bigint UNSIGNED DEFAULT 0 NOT NULL COMMENT '排序';
END IF;
UPDATE `tag` SET `name` = 'UI Component Set' WHERE `name` = 'UI Component Sets';
END;
-- 使用方法
CALL Temp_20230102_DDL_tag();
-- 不再需要可删除
DROP PROCEDURE Temp_20230102_DDL_tag;