mysql查询重复记录

mysql中数据去重和优化

老子叫甜甜 提交于 2020-01-03 08:34:19
更改表user_info的主键uid为自增的id后,忘了设置原来主键uid属性为unique,结果导致产生uid重复的记录。为此需要清理后来插入的重复记录。 基本方法可以参考后面的附上的资料,但是由于mysql不支持同时对一个表进行操作,即子查询和要进行的操作不能是同一个表,因此需要通过零时表中转一下。 写在前面:数据量大时,一定要多涉及的关键字段创建索引!!!否则很慢很慢很慢,慢到想死的心都有了 1 单字段重复 生成零时表,其中uid是需要去重的字段 create table tmp_uid as (select uid from user_info group by uid having count(uid)) create table tmp_id as (select min(id) from user_info group by uid having count(uid)) 数据量大时一定要为uid创建索引 create index index_uid on tmp_uid create index index_id on tmp_id 删除多余的重复记录,保留重复项中id最小的 delete from user_info where id not in (select id from tmp_id) and uid in (select uid from tmp_uid

关于幻读

浪尽此生 提交于 2020-01-01 04:18:06
不可重复读 在同一事务中,两次读取同一数据,得到内容不同,侧重点在于数据修改 幻读 同一事务中,用同样的操作读取两次,得到的记录数不相同,幻读的侧重点在于两次读取的纪录数量不一致 不可重复读和幻读在概念上有些交叉,对于不可重复读来说,在同一个事务中,如果读取到的记录数量发生变化,也可以看作是一种不可重复读,同样,对于幻读来说,同一个事务中的读取结果数量一致,但是内容发生了变化,也可以看成是一种不可重复读。 对于mysql,这里讨论一下read committed和repeatable read两个事务隔离级别的不可重复读和幻读: read committed: 在read committed隔离级别下,存在不可重复读和幻读现象。 起两个事务1和2,1采用快照读读取数据,2修改其中一条满足1查询条件的数据并提交,这时1再快照读一次,就会发现2添加的记录,这就是不可重复读。但如果1采用当前读方式读取数据,由于读取数据的时候会给满足条件的数据加锁,因此,事务2无法修改数据内容,如果单纯从数据内容发生变化这个方面来考虑的话,是不会出现不可重复读的问题的。同时,如果考虑到记录数量增减,由于read committed隔离级别并没有gap锁,所以虽然不能修改采用当前读方式锁定的数据,但是可以在查询条件满足的范围内增加新的数据,这也可以看作是一种不可重复读,但显然这种情况划分到幻读更好。

MySQL面试总结

浪尽此生 提交于 2019-12-14 20:29:18
MySQL面试总结 # MySQL的存储引擎 `MyISAM`(默认表类型):非事务的存储引擎,基于传统的`ISAM`(有索引的顺序访问方法)类型,是存储记录和文件的标准方法,不是事务安全,不支持外键,适用于频繁的查询。表锁,不会出现死锁,适合小数据和小并发。 - 为什么不会出死锁?(没有事务就不会继续持有锁) 答:因为`MyISAM`再查询的时候,会同时锁定这个`sql`里面所有用到的表(获取锁的顺序是一致的),不局限与一张表,再写锁又重叠时,就得等待。 **注意:【`MySQL5.5`之前默认的是`MyISAM`引擎了,5.5之后的版本默认都是`innodb`作为存储引擎】** `innodb`:支持事务安全的存储引擎,适用于插入和更新,支持外键,行锁,事务。适合大数据,大并发。特别是针对多个并发和`QPS`较高的情况。 - `QPS:`就是每秒查询率,`QPS`是对一个特定服务器再规定时间内能处理多少流量的衡量标准。 - `TPS:`就是每秒传输处理的事务个数。 - `innodb`的行锁模式:共享锁,排他锁,意向共享锁(表锁),意向排他锁(表锁),间隙锁。(注意:如果`sql`语句没有使用索引,`innodb`不能确定操作的行时,使用意向锁(表锁))。 - 死锁问题 - 什么是死锁? 死锁就是当俩个事务都需要获取对方持有的排他锁才能完成事务的时候,就导致了循环锁等待

MySQL去除查询结果重复值

馋奶兔 提交于 2019-12-10 17:04:07
在使用mysql时,有时需要查询出某个字段不重复的记录,虽然mysql提供有distinct这个关键字来 过滤 掉 多余的重复记录只保留一条,但往往只用它来返回不重复记录的条数,而不是用它来返回不重记录的所有值。其原因是distinct只能返回它的目标字段,而 无法返回其它字段,这个问题让我困扰了很久,用distinct不能解决的话,我只有用二重循环查询来解决,而这样对于一个数据量非常大的站来说,无疑是 会直接影响到效率的。所以我花了很多时间来研究这个问题,网上也查不到解决方案,期间把容容拉来帮忙,结果是我们两人都郁闷了。。。。。。。。。 下面先来看看例子: table id name 1 a 2 b 3 c 4 c 5 b 库结构大概这样,这只是一个简单的例子,实际情况会复杂得多。 比如我想用一条语句查询得到name不重复的所有数据,那就必须使用distinct去掉多余的重复记录。 select distinct name from table 得到的结果是: name a b c 好像达到效果了,可是,我想要得到的是id值呢?改一下查询语句吧: select distinct name, id from table 结果会是: id name 1 a 2 b 3 c 4 c 5 b distinct怎么没起作用?作用是起了的,不过他同时作用了两个字段

Innodb中的事务隔离级别和锁的关系

元气小坏坏 提交于 2019-12-09 00:08:07
前言: 我们都知道事务的几种性质,数据库为了维护这些性质,尤其是一致性和隔离性,一般使用加锁这种方式。同时数据库又是个高并发的应用,同一时间会有大量的并发访问,如果加锁过度,会极大的降低并发处理能力。所以对于加锁的处理,可以说就是数据库对于事务处理的精髓所在。这里通过分析MySQL中InnoDB引擎的加锁机制,来抛砖引玉,让读者更好的理解,在事务处理中数据库到底做了什么。 #一次封锁or两段锁? 因为有大量的并发访问,为了预防死锁,一般应用中推荐使用一次封锁法,就是在方法的开始阶段,已经预先知道会用到哪些数据,然后全部锁住,在方法运行之后,再全部解锁。这种方式可以有效的避免循环死锁,但在数据库中却不适用,因为在事务开始阶段,数据库并不知道会用到哪些数据。 数据库遵循的是两段锁协议,将事务分成两个阶段,加锁阶段和解锁阶段(所以叫两段锁) 加锁阶段:在该阶段可以进行加锁操作。在对任何数据进行读操作之前要申请并获得S锁(共享锁,其它事务可以继续加共享锁,但不能加排它锁),在进行写操作之前要申请并获得X锁(排它锁,其它事务不能再获得任何锁)。加锁不成功,则事务进入等待状态,直到加锁成功才继续执行。 解锁阶段:当事务释放了一个封锁以后,事务进入解锁阶段,在该阶段只能进行解锁操作不能再进行加锁操作。 事务 加锁/解锁处理 begin; insert into test .....

MySQL数据库 (下)

不羁岁月 提交于 2019-12-08 05:18:29
MySQL数据库 (下) MySQL高级应用 一、 MySQL联结表 : 预备知识: 1、关系表:把信息分解成多个表, 一类数据 一个表, 各表 通过某些 共同的值相互关联 (所以才称为 关系数据库 )。 2、联结:联结是一种机制,用来在一条SELECT语句中关联表,因此称为联结。通过联结,一条SELECT语句可以联结多个表返回一组输出。 3、完全限定列名: 表名+ . +列名 。 4、笛卡儿积(叉联积):由没有联结条件表关系返回的结果为笛卡儿积,结果的行数是第一个表的行数乘以第二个表的行数。 5、表别名和列别名(SQL 一个别名只存在于查询期间。表别名只会在查询执行中使用。与列别名不同,表别名不返回MySQL客户端):SELECT 列名 AS 列别名 FROM 表名 AS 表别名 (Oracle中没有AS,别名设置不用AS,直接指定别名即可)   一、 INNER JOIN(内连接/等值连接)--获取两个表中字段匹配关系的记录; mysql> SELECT a.runoob_id, a.runoob_author, b.runoob_count FROM runoob_tbl a INNER JOIN tcount_tbl b ON a.runoob_author = b.runoob_author; mysql> SELECT a.runoob_id, a.runoob

mysql中去重 distinct 用法

亡梦爱人 提交于 2019-12-06 14:33:53
#########sample 1 mysql中去重 distinct 用法 在使用 MySQL 时,有时需要查询出某个字段不重复的记录,这时可以使用mysql提供的distinct这个关键字来过滤重复的记录,但是实际中我们往往用distinct来返回不重复字段的条数(count(distinct id)),其原因是distinct只能返回他的目标字段,而无法返回其他字段,例如有如下表user: 用distinct来返回不重复的用户名:select distinct name from user;,结果为: 这样只把不重复的用户名查询出来了,但是用户的id,并没有被查询出来:select distinct name,id from user;,这样的结果为: distinct name,id 这样的mysql 会认为要过滤掉name和id两个字段都重复的记录,如果sql这样写:select id,distinct name from user,这样mysql会报错,因为distinct必须放在要查询字段的开头。 所以一般distinct用来查询不重复记录的条数。 如果要查询不重复的记录,有时候可以用group by : select id,name from user group by name; https://www.cnblogs.com/shiluoliming/p

Mysql事务隔离级别

只谈情不闲聊 提交于 2019-12-04 04:18:22
一、事务的四大特性(简称ACID) 数据库如果支持事务的操作,那么就具备以下四个特性: 1、原子性(Atomicity) 事务是数据库的逻辑工作单位,事务中包括的诸操作要么全做,要么全不做。 2、一致性(Consistency) 事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。 3、隔离性(Isolation) 一个事务的执行不能被其他事务干扰。 4、持续性/永久性(Durability) 一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。 二、事务的四种隔离级别 按照SQL:1992 事务隔离级别,InnoDB默认是可重复读的(REPEATABLE READ)。MySQL/InnoDB 提供SQL标准所描述的所有四个事务隔离级别。你可以在命令行用--transaction-isolation选项,或在选项文件里,为所有连接设置默认隔离级别。 例如,你可以在my.inf文件的[mysqld]节里类似如下设置该选项: transaction-isolation = {READ-UNCOMMITTED | READ-COMMITTED | REPEATABLE-READ | SERIALIZABLE} 用户可以用SET TRANSACTION语句改变单个会话或者所有新进连接的隔离级别。它的语法如下: SET [SESSION |

sql删除重复记录

↘锁芯ラ 提交于 2019-12-03 21:19:47
用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1、查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 select * from people where peopleId in (select peopleId from people group by peopleId having count(peopleId) > 1) 2、删除表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断,只留有rowid最小的记录 delete from people where peopleName in (select peopleName from people group by peopleName having count(peopleName) > 1) and peopleId not in (select min(peopleId) from people group by peopleName having count(peopleName)>1) 3、查找表中多余的重复记录(多个字段) select * from vitae a where (a.peopleId,a.seq) in (select peopleId,seq from vitae group by

mysql面试题

◇◆丶佛笑我妖孽 提交于 2019-12-03 07:22:57
事务四大特性 原子性:不可分割的操作单元,事务中所有操作,要么全部成功;要么撤回到执行事务之前的状态 一致性:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的; 隔离性:事务操作之间彼此独立和透明互不影响。事务独立运行。这通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。 持久性:事务一旦提交,其结果就是永久的。即便发生系统故障,也能恢复。 MySQL 的事务隔离级别 未提交读(Read Uncommitted):允许脏读,其他事务只要修改了数据,即使未提交,本事务也能看到修改后的数据值。也就是可能读取到其他会话中未提交事务修改的数据 提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)。 可重复读(Repeated Read):可重复读。无论其他事务是否修改并提交了数据,在这个事务中看到的数据值始终不受其他事务影响。 串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞 MySQL数据库(InnoDB引擎)默认使用可重复读( Repeatable read) 索引 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用 B_TREE。B