数据去重

单表插入时候单例去重

这种方式是使用mysql自带的语法但是这种方式必须保证需要去重的列是主键或者唯一索引(这样基本百分之50的场景就不能使用了,因为很多场景都是多例同时满足才算重复,允许单例重复的)

插入时候如果发现是重复的,那么删除原来的保留新的

replace  INTO `ip_pool_new` ( `ip`, `type`, `score`)
VALUES (1, 1, 10);

插入时候如果发现是重复的,那么修改原来的数据
场景: 若数据表中存在相同主键的记录,我们就更新该条记录。

单条

INSERT INTO mRowUpdate(id,`value`) VALUES(3, 'SuperMan') ON DUPLICATE KEY UPDATE `value`='SuperMan';

多条

-- 我们可以使用VALUES(`b`) 的方式直接拿插入的值作为修改也行
INSERT INTO `table` (`a`, `b`, `c`) VALUES (1, 2, 3), (4, 5, 6) ON DUPLICATE KEY UPDATE `c`=VALUES(`a`)+VALUES(`b`);

不能使用这种方式的几个条件(否则会发生未知问题):

  1. 唯一列大于1 (主键,唯一索引)
  2. 在有可能有并发事务执行的insert 语句情况下不使用该语句,可能导致产生(死锁)。
  3. 如果数据表id是自动递增的不建议使用该语句;id不连续,如果前面更新的比较多,新增的下一条会相应跳跃的更大。(看情况吧)

插入时候如果发现是有重复的,那么跳过

INSERT ignore  INTO `ip_pool_new` ( id,`ip`, `type`)
VALUES (1,1, 1),(14, 1, 10);

单表多列去重

下语句去重 (ip=1 and port=1)

delete from ip_pool_new where id in(
SELECT a.id from (select a.id FROM (select id from ip_pool_new where ip=1 and port=1) as a
where a.id<>(select id from ip_pool_new where ip=1 and port=1  LIMIT 1  )) as a
) 

这里我多套了一层派生表不然会出现1093 - You can’t specify target table ‘ip_pool_new’ for update in FROM clause错误意思是不能自己操作自己

如果是整个表所有数据都要去,重我们就需要使用存储过程了(懒人版,直接在mysql中启动就行了,我试过了100万数据跑了2天,建议使用程序开启多线程跑)

CREATE DEFINER=`root`@`%` PROCEDURE `de-weight`()
BEGIN--      定义变量declare row_ip   VARCHAR(30);declare row_port INT default 0;declare row_count int default 0; -- 记录总行数declare i int default 0; -- 记录循环次数--      定义游标declare getcategory cursor for select  `ip` ,`port` from ip_pool_new ;-- 获取总行数  查询后赋给 row_cat_count变量select  COUNT(*) into row_count from ip_pool_new ; -- 打开游标open getcategory;--  循环取值WHILE i<row_count do-- 取每一行的值fetch getcategory into row_ip,row_port;--  去重delete from ip_pool_new where id in(SELECT a.id from (select a.id FROM (select id from ip_pool_new where ip=row_ip and port=row_port) as a where a.id<>(select id from ip_pool_new where ip=row_ip and port=row_port  LIMIT 1  )) as a);--           循环次数加一SET i=i+1; end WHILE ;-- 关闭游标close getcategory;END

如果使用编程语言,python(多进程),java(多线程)…跑的话,存储函数如下
方法: 先查询出全部数据,然后在代码中使用for进行循环调用存储函数

CREATE DEFINER=`root`@`%` PROCEDURE `deWeight`(in row_ip  VARCHAR(30),in row_port INT )
BEGIN--  去重delete from ip_pool_new where id in(SELECT a.id from (select a.id FROM (select id from ip_pool_new where ip=row_ip and port=row_port) as a where a.id<>(select id from ip_pool_new where ip=row_ip and port=row_port  LIMIT 1  )) as a);END

大约就几十分钟,注意死锁的情况悠着点

ip存储问题

又问会说直接使用varchar(50) 来存储ip,大家都知道的一个问题就是字符串查询效率慢,那么如何解决呢?我们可以使用bigint(20) 来存储ip,那么这就需要使用mysql自带的函数来帮我们转换(注意给ip列添加索引)

  1. 将ip转换为bigint

    INSERT INTO `ip_pool_new` ( `ip`, `type`, `score`)
    VALUES ( INET_ATON('106.75.226.36'), 1, 10);
    
  2. 将bigint转换为ip

    select `id`,INET_NTOA(`ip`),`port`, `type`, `score` from ip_pool_new
    

效果

解决表行页死锁文件

MySQL有三种锁的级别:页级、表级、行级。

表级锁:开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。

行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。

页面锁:开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般

所谓死锁: 是指两个或两个以上的进程在执行过程中,
因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去.
此时称系统处于死锁状态或系统产生了死锁,这些永远在互相等竺的进程称为死锁进程.
表级锁不会产生死锁.所以解决死锁主要还是把业务逻辑弄清楚

以下语句能判断出来是否是死锁了
查看办法: 看是否进程或者某些锁一直存在,然后查看表内数据是否发送变化.如果表内被操作的数据没有任何变化,然后锁一直存在那么就表示死锁了


--多少线程正在使用某张表
show OPEN TABLES where In_use > 0;show status like '%lock%'-- 查询全部进程
show processlist-- mysql 5.7 之前
-- 查看正在锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;
-- 查看等待锁的事务
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;-- mysql 5.7之后的命令
--  查询正在锁的事务
SELECT * FROM performance_schema.data_locks
-- 查看等待锁的事务
SELECT * FROM performance_schema.data_lock_waits-- 查找当前正在运行中的锁
select * from information_schema.innodb_trx-- 查看最近死锁的日志
show engine innodb status -- 查看锁表
show status like 'table%';
-- 查看行锁
show status like 'InnoDB_row_lock%'

用以上命令可以查询各种锁和线程的情况,使用下面方式暴力解决

执行下面代码,复制结果,然后进入mysql的命令行,将查询的复制的内容全部复制到命令行中然后回车,就会强行杀死全部进程

--   万能解决方案
--  删除全部的进程
SELECT concat("kill ",id,";") FROM information_schema.`PROCESSLIST`
-- 删除指定库的进程
SELECT concat("kill ",id,";") FROM information_schema.`PROCESSLIST` WHERE DB="voidme"

同一个mysql服务器下两个不同的数据库之间的联查

同一个mysql服务器下多库联动

在同一个mysql服务器下,不同的两个数据直接加上库名就可以实现跨库,增删改查,列:

跨服msyql服务器多表联动

实现原理类似一个虚拟映射,需要用到mysql的另一个存储引擎Federated

FEDERATED存储引擎访问在远程数据库的表中的数据,而不是本地的表。
这个特性给某些开发应用带来了便利,你可以直接在本地构建一个federated表来连接远程数据表配置好了之后本地表的数据可以直接跟远程数据表同步。实际上这个引擎里面是不真实存放数据的,所需要的数据都是连接到其他MySQL服务器上获取。

mysql默认没有开启federated存储引擎,需要在配置文件里面开启;

#在[mysqld] 下 添加 federated 然后重启mysql服务就可以了
[mysqld]
federated
#输入命令查看引擎开启状态
show engines;

如果为YES就是已经开启了

然后就可在test1数据库上创建虚拟表了,将test2库上t_test2表映射到test1库上面

CREATE TABLE `t_test2` (`id` int NOT NULL,`name` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`)
) ENGINE=FEDERATED DEFAULT CHARSET=utf8mb3 COMMENT='远程测试表t_test2' CONNECTION='mysql://root:123456@127.0.0.1:3306/test2/t_test2' ;

CONNECTION=‘mysql://root:123456$@127.0.0.1:3306/test2/t_test2’ 这个配置是关键
root:代表远程数据库的用户
123456:代表远程数据的密码
127.0.0.1:3306:代表远程数据库的ip地址和端口号,域名也可以
test2:代表远程数据库的数据库名称
t_test2:代表远程数据库中的哪一张表

然后你就会发现在库下出现一张你创建的表,之后就可以和正常的表一样增删改查了

查询所有关联指定表的外键和删除

SELECT * FROM information_schema. KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA="bpmou162-019"AND REFERENCED_TABLE_NAME="hd_group'

通过存储过程删除指定数据库指定表相关的所有子表的外键\

-- 在指定的库下运行
CREATE DEFINER=`root`@`%` PROCEDURE `删除指定库的的所有指定表的子表外键`(in dbName VARCHAR(30),in tableName VARCHAR(30))
BEGIN
--
declare row_cat_TABLE_NAME VARCHAR(30);  -- 表名称
declare row_cat_CONSTRAINT_NAME VARCHAR(30); -- 外键名称
declare row_cat_count int default 0; -- 记录总行数
declare i int default 0; -- 记录循环次数
-- 定义游标  declare getcategory cursor for SELECT TABLE_NAME,CONSTRAINT_NAME FROM information_schema. KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA=dbName AND REFERENCED_TABLE_NAME=tableName;-- 获取总行数  查询后赋给 row_cat_count变量SELECT COUNT(*) into row_cat_count FROM information_schema. KEY_COLUMN_USAGE WHERE CONSTRAINT_SCHEMA=dbName AND REFERENCED_TABLE_NAME=tableName;-- 打开游标open getcategory;--  循环取值WHILE i<row_cat_count do-- 取每一行的值fetch getcategory into row_cat_TABLE_NAME,row_cat_CONSTRAINT_NAME;select row_cat_TABLE_NAME,row_cat_CONSTRAINT_NAME;--  删除外键SET @ALTER_FOREIGN = CONCAT(' ALTER TABLE ', row_cat_TABLE_NAME, ' DROP FOREIGN KEY ', row_cat_CONSTRAINT_NAME, ';');/*预处理SQL,如果SQL格式不对,则会报错。*/PREPARE sql_sentence FROM @ALTER_FOREIGN;/*执行SQL*/EXECUTE sql_sentence;/*取消预处理。*/DEALLOCATE PREPARE sql_sentence;SET i=i+1;end WHILE ;-- 关闭游标close getcategory;END

运行

-- 在指定的库下运行
CALL `删除指定库的的所有指定表的子表外键`('test_db','t_user')

查询当天时间,相隔多少天前的数据

-- 查询当前时间, 相隔5天前的数据
SELECT * FROM hd_increment WHERE  create_time<DATE_ADD(NOW(), INTERVAL -5  DAY)

完全复制表(备份)

第一种方式(会丢失主键的)

CREATE TABLE t_user_copy  SELECT * FROM t_user;

第二种方式(完全复制,推荐)

-- 创建t_user的备份表t_user_copy
CREATE TABLE t_user_copy LIKE t_user;
-- 将t_user 数据复制到t_user_copy里
INSERT  INTO t_user_copy SELECT * FROM  t_user;

点赞 -收藏-关注-便于以后复习和收到最新内容 有其他问题在评论区讨论-或者私信我-收到会在第一时间回复 感谢,配合,希望我的努力对你有帮助^_^ 免责声明:本文部分素材来源于网络,版权归原创者所有,如存在文章/图片/音视频等使用不当的情况,请随时私信联系我。

MySQL-复杂问题记录和解决相关推荐

  1. MYSQL 取随机记录的方法

    一直以为mysql随机查询几条数据,就用 SELECT*FROM`table`ORDERBYRAND()LIMIT5 就可以了. 但是真正测试一下才发现这样效率非常低.一个15万余条的库,查询5条数据 ...

  2. 安装mysql出现错误_安装Mysql时出现错误及解决办法

    因为一时手痒痒更新了一下驱动,结果导致无线网卡出了问题.然而就算是从官网上下载了驱动各种折腾也没有弄好,心里特别堵.无奈只有重装系统这一条路了.这里表示特别难过,因为电脑上东西实在太多了,而且各种环境 ...

  3. centos7安装mysql日志空白_centos7安装Mysql爬坑记录 - G

    centos7安装Mysql爬坑记录 查看是否已安装 使用下列命令查看是否已经安装过mysql/mariadb/PostgreSQL 如果未安装,不返回任何结果(ECS的centos镜像默认未安装任何 ...

  4. mysql查询死锁的次数_一次神奇的MySQL死锁排查记录

    一次神奇的MySQL死锁排查记录 发布时间:2020-08-29 00:50:26 来源:脚本之家 阅读:135 作者:咖啡拿铁 背景 说起Mysql死锁,之前写过一次有关Mysql加锁的基本介绍,对 ...

  5. 并发场景下MySQL存在的问题及解决思路

    转载自 并发场景下MySQL存在的问题及解决思路 目录 1.背景 2.表锁导致的慢查询的问题 3.线上修改表结构有哪些风险? 4.一个死锁问题的分析 5.锁等待问题的分析 6.小结 一.背景 对于数据 ...

  6. win7 mysql 密码_笔记本win7系统下mysql忘记密码的最佳解决方法

    MySQL是一个关系型数据库管理系统,在笔记本win7系统下编程的时候就需要用到MySQL数据库,不过有时候一段时间没用的话,可能会忘记数据库的登录密码了,当忘记密码就无法进入mysql,要如何解决呢 ...

  7. 电脑上mysql数据库无法登录_无法远程登入MySQL数据库的几种解决办法MySQL综合 -电脑资料...

    方法一: 尝试用MySQL Adminstrator GUI Tool登入MySQL Server,Server却回复错误讯息:Host '60-248-32-13.HINET-IP.hinet.ne ...

  8. mysql外建名是随机的吗_创建角色随机名字(mysql抽取随机记录)和mysql游标的使用_MySQL...

    最近在开发中遇到了一些问题,在此记录一下解决的方法,已作备忘. 1.现在创建游戏角色的时候,基本上都是支持角色名字随机的,以前此功能在客户端用代码实现,然后向服务器请求并验证,后来发现有时候连续几次都 ...

  9. mysql nt.exe 占cpu_解决并分析mysqld-nt.exe大量占用CPU问题

    早上帮朋友一台服务器解决了 Mysql cpu 占用 100% 的问题,稍整理如下,希望对各位有所帮助. 朋友主机(Windows 2003 + IIS + PHP + MYSQL )近来 MySQL ...

  10. Mysql RR级别下如何解决幻读

    快照读 在RR级别下,Mysql是根据MVCC来解决快照读时发生的幻读现象,简单来说就是利用了版本链以及Read View来实现的,RR下只有事务刚一开始时才会产生Read View,后续都会使用这个 ...

最新文章

  1. Vue2.0中引入element-ui
  2. 给recycleview添加尾部
  3. 在mysql中建立聚簇索引_给我一分钟,让你彻底明白MySQL聚簇索引和非聚簇索引...
  4. war包热更新_基于IDEA热部署更新服务器Tomcat类,服务器Tomcat热更新
  5. vuex其实超简单,只需3步
  6. r语言结构方程模型可视化_R语言时间序列分析(二):ts对象及其可视化
  7. xp安装python3.4_32位XP系统 Python3.4.4安装scrapy1.6.0
  8. 继电保护原理3-输电线纵差
  9. undo歌词中文音译_undo的中文谐音歌词
  10. IPv6 的速度比 IPv4 更快?
  11. 三菱伺服电机马达使用注意事项
  12. 云计算机领域的黑马AWS,为何一黑到底
  13. thinkphp使用163/126邮箱发送
  14. java fadein_jQuery fadeIn()和fadeOut()方法
  15. 老师想知道从某某同学当中,分数最高的是多少,现在请你编程模拟老师的询问。当然,老师有时候需要更新某位同学的成绩. 输入描述:
  16. 开源库UniTask笔记
  17. 小米2s Android pie,Android 9.0 Pie正式版发布,小米MIX 2S率先升级,国内第一款!
  18. Idea使用系统应用打开md文件
  19. JPO Summary
  20. php开发cms漏洞,bagecms漏洞复现

热门文章

  1. k-Means的优缺点
  2. 【office考试】二级MS操作题试题解析-电子表格题
  3. TanGo 免费版 安装方法
  4. 网络变压器产品可以做到多大的绝缘电压?4000V可以吗?
  5. 东莞市选 格斗俱乐部(区间dp)
  6. 目标检测算法回顾之发展概览
  7. 阿里云开源业界首个面向NLP场景深度迁移学习框架
  8. android重要进程的主要功能
  9. hiho1550 顺序三元组
  10. python什么是入口文件_小问题大隐患:如何正确设置 Python 项目的入口文件?