mysql优化小技巧之去除重复项实现方法分析【百万级数据】
作者:luyaran 发布时间:2024-01-17 03:44:31
本文实例讲述了mysql优化小技巧之去除重复项实现方法。分享给大家供大家参考,具体如下:
说到这个去重,脑仁不禁得一疼,尤其是出具量比较大的时候。毕竟咱不是专业的DB,所以嘞,只能自己弄一下适合自己去重方法了。
首先按照常规首段,使用having函数检查重复项,完事一个一个的删除。不要问我having检测重复项的sql咋写,你懂得哈。。。这个在只有几条重复的时候还可以。要是几千上万条不同数据重复,那咋办。。。
完事呢,咱就考虑了,用having函数查询的时候,原始sql如下:
select `name`,count(*) as count from sentence group by `name` having count>1
大家可以运行感觉下,在五百万左右的数据时,那速度,麻油。。。
但是嘞,咱在不考虑优化它的运行速度的前提下,来考虑使用这个语句来使我们去除数组中的重复项。首先,我们要知道,我们删除重复数据的时候需要使用的数据有哪些。id是肯定的,再来呢,筛选的条件是吧。所以嘞,上面的sql查询出来的数据,缺少了啥,id。。。那我们加上这个字段查询下试试哈:
select id,`name`,count(*) as count from sentence group by `name` having count>1
结果呢,就会显示出来id,name,count这三个字段。具体效果大家可以自己运行看下。根据这些数据咱们就可以进行去除重复项的操作了。
具体的sql设计就是删除id不是咱们查询出来的id,但是name值是咱们查询出来的值,因为咱们的数据不是一条,所以得经过程序处理,把所有的id用逗号拼接起来,name值用引号和逗号处理下,完事就可以进行使用了,示例呢就在下方:
delete from sentence where id not in(1,2,3) and name in('a','b','c')
如果数据过多的话,咱们可以写成脚本,完事再进行分批次操作。嘿嘿,到了这里,咱们就可以进行去除重复项的操作了,但是这个速度么,始终是个困扰。接下来咱们就要考虑如何来优化这个sql,让它的速度上去,就算是大功告成了。
既然是提升咱们sql的运行速度,按照常理来讲,首先应该想到的那就是索引。好呗,废话不多说,咱们先建立索引。但是给那个字段建立所以呢???这又是个问题了。
这个原则上是在你name字段可以加以区分的字段上建立的。比如,我的name字段里面储存的是一条条的品牌名称,然后呢,我有一个industry字段是来存储每个品牌的行业的,所以我就在我的industry字段上建立了索引。当然,还有更加合适的,这个就看大家咋考虑了。废话不多说,咱直接来看看我们优化后的sql:
select id,`name`,count(*) as count from sentence where industry = '饮品' group by `name` having count>1
运行结果如下:
结果说明啥,说明咱们的索引有在使用哦。。。那速度,咱不说各位看官应该也了解。完事咱们就可以再用程序把所有的id用逗号拼接起来,name值用引号和逗号处理下,完事就可以进行那个去除重复项的大业了。效率明显上升啊。。。
不过有的看官可能用的条件里面含有like等会使索引失效的条件,那咱们还可以,把数据简单分类,完事分别检测每个分类的数据,全部查询出来后,可以使用程序来检查重复项,并且取出删除所需要的数据。
附:mysql rand查询优化&随机查询优化
说起这个随机查询,大家都知道使用rand()函数,但是当数据量达到一定程度的时候,查询效率就可想而知了。所以呢?我们不妨考虑下优化这个查询方案。
我的优化方式为,通过程序来随机,再配合limit来取值。咱们记录下大概思路哈。
首先查询出符合条件的数据条数,之后用PHP的rand函数来在这个数值范围内随机取值,之后直接查询就可以。
示例sql:
select count(*) from test where $where;
(计算所需要的数据的总条数)
$offset = rand(0,$count)
select * from test where $where limit $offset,1;
(查询出所需数据)
大家可以动手试试。五百万左右的数据情况下,查询速度较之mysql的rand函数查询方式快了最少十倍。
好啦,本次分享就到这里了。
希望本文所述对大家MySQL数据库计有所帮助。
来源:https://blog.csdn.net/luyaran/article/details/80649292


猜你喜欢
- 一.ajax介绍1、ajax的含义Ajax全称“Async Javascript And XML”即:异步的javascript和XML。它
- 前言最近在功能性测试的过程中,需要在Python环境下用OpenCV读取网络摄像头的视频流,接着用目标检测器进行视屏帧的后续处理。在测试过程
- python新手一枚,操作系统Win10 64 bit,Python版本,3.7因为某个脚本需要用到win32con 和win32api模块
- 0.目标这一节,我将实现一个简单的发送邮件功能。1.部署1.1 部署Express如果不知道如何部署,可参照:部署Express1.2 准备
- 看一看自己写的类是否能符合这样的标准.要成为高手,我要走的路还很长.摘抄自《OOD 启示录》--Arthur J.Riel(1)所有数据都应
- 一、python判断文件和文件夹是否存在、创建文件夹 >>> import os>>> os.
- 前言需要从数据库检索某些符合要求的数据,我们很容易写出 Select A B C FROM T WHERE ID = XX 这样
- 新年礼,提供简单、易套用的 jQuery AJAX 上传示例及代码下载。后台对文件的上传及检查,以 C#/.NET Handler 处理 (
- Tkinter(即 tk interface,简称“Tk”)本质上是对 Tcl/Tk 软件包的 Py
- 在一个群上看到好几次问到call和apply的作用,function这两个方法的效果大家都很容易理解,但一般很难让人深刻地理解使用它们的时机
- 目录正文开始1. DRF 中的限流2. 限流进阶配置3. 限流思路分析4. 源码分析5. 其它注意事项参考资料正文开始先说一个限流这个概念,
- 数据库的数据量达到一定程度之后,为避免带来系统性能上的瓶颈。需要进行数据的处理,采用的手段是分区、分片、分库、分表。一、什么是mysql分表
- 当使用pytorch写网络结构的时候,本人发现在卷积层与第一个全连接层的全连接层的input_features不知道该写多少?一开始本人的做
- 1,使用mysqldump时报错(1064),这个是因为mysqldump版本太低与当前数据库版本不一致导致的。mysqldump: Cou
- ini文件是windows中经常使用的配置文件,主要的格式为:[Section1]option1 : value1option2 : val
- CentOS 7上PHP默认是以apache或者nobody的身份运行的,这种方式下由于PHP运行需要的权限比较大,会有安全隐患,还可能会受
- 如下所示:import sysfrom PyQt5.QtWidgets import QMainWindow, QTextEdit, QAc
- 如下所示:new_array = np.zeros((5,4))for i in range(3): new_array[i] = np.a
- 本文使用pygame实现播放mp3,文中用到pygame及mutagen库,安装:pip install pygamepip install
- pt-kill 是一个优秀的kill MySQL连接的一个工具,是percona toolkit的一部分,在因为空闲连接较多导致超过最大连接