-
mysql中in查询效率低的替代方法_mysql查询语句很慢?可以试试几种SQL优化
2020-11-28 03:23:50一般数据量少的时候,连接开小不大,一般不会有性能问题,当数据量变大后,那么性能问题就会比较突出。所以在数据库初期最好能确定哪个表能成为大表,然后进行反范式设计减少连接的表,例如增加冗余字段等等,或者在...连接查询的优化
无论什么数据库,多表连接的查询成本都是比较高的,因此对于高并发应用,应该尽量减少有连接的查询,多表连接的个数不要超过4张表。一般数据量少的时候,连接开小不大,一般不会有性能问题,当数据量变大后,那么性能问题就会比较突出。所以在数据库初期最好能确定哪个表能成为大表,然后进行反范式设计减少连接的表,例如增加冗余字段等等,或者在业务代码中进行连接计算。
一些经验总结点:
1、ON、USING字句中的列确认有索引,如果连接的顺序为B、A,那么只需在A表的列上创建索引即可,无需在B中建索引,可以减少不必要索引开销。
查询举例:
SELECT B.*,A.* FROM B JOIN A ON B.col1 = A.col2
MYSQL会全表扫描B表,对B表的每一行记录去寻找A表记录,所以需用A表COL2列上索引来提高效率。
2、使用EXPLAIN 检查连接,看ROWS列,如果该列值太高,比如几千,上万的,那么就需要考虑是否索引无效后者连接表的顺序不对了。
3、考虑在应用层实现连接查询,例如可以在JAVA中把复杂的查询分解为几个简单查询,得到一个较小的结果集合,处理遍历后,再根据条件获取完整数据,这样做往往更高效,因为把数据分离,更不容易变化,有利于数据库缓存数据。
举例如下:
SELECT a.* FROM A WHERE a.id IN(1,2,3,4,5,6,7,8,9,10);
如果id=1~8的记录已经被存储在缓存REDIS中了,那么我们只需要查询id=9和10的数据,这样减少了很多数据库连接交互,可以提高性能。
GROUP BY、DISTINCT、ORDER BY 语句优化
这些语句默认都要进行ORDER BY排序,优化的思路比较类似。
1、如果多张表进行连接查询,ORDER BY 的列应属于连接顺序的第一张表。如果不在同一个表中,那么可以考虑冗余一些列,或者合并表。
2、需要保证索引列和ORDER BY的列相同,且各列按照相同的方向进行排序。
3、指定ORDER BY NULL,默认情况下,MYSQL将排序所有GROUP BY的查询,如果想要避免排序结果所产生的消耗,可以指定ORDER BY NULL。
举例如下:
select count(1) from sys_dept group by dept_id order by null limit 3
子查询优化
由于子查询可读性比较符合开发人员的思路习惯,所以都习惯编写子查询,但子查询在生产环境中,是最常见的性能瓶颈。
对于数据库来说,大部分情况下,连接比子查询更快,优化器一般可以生成更佳的执行计划,可以余弦装载数据,更高效的处理查询,子查询生成的临时表也没有索引,因此效率会更低。
目前的实践来说,子查询应该尽量改写成JOIN的写法
举个常见的例子
SELECT c1 FROM t1 where t1.c1 IN (SELECT c1 FROM t2);
我们可以转化为连接的方式:
SELECT c1 FROM t1.c1 FROM t1,t2 WHERE t1.c1=t2.c2
优化IN列表
对于IN列表,MySQL会排序里面的值,并使用二分查找方式去定位数据,把IN字句改写成OR形式其实没什么用。IN列表不建议太长,对于高并发业务,建议不超过几十个。优化思路可以转化为多个等于的查询。例如下面的语句,如果ID值很多,其实性能不会太好。
SELECT * FROM A where A.ID IN(SELECT id FROM B)
优化思路:
可以从程序业务层出发,先查询SELECT id FROM B,然后获取到ID的值,逐步和 SELECT * FROM A进行拼接,转化为 SELECT * FROM A where ID =?的形式。
优化UNION
UNION语句默认是去除重复记录,需要用到排序操作,如果结果集很大,成本会很高,建议尽量使用UNION ALL 语句,对于UNION多个分表场景,应尽可能在数据库分表的时候,就确定各个分表数据唯一性,这样就无需使用UNION来去重了。
另外查询语句外的WHERE条件并不会应用到每个单独的UNION子句中,所以每个UNION子句都添加where条件。
优化BLOB、TEXT类型字段的查询
由于mysql内存临时表暂不支持BLOB、TEXT类型,如果包含他们的查询就要用到基于磁盘的临时表,性能会很低,所以如无必要,查询条件就不要这2种类型。
优化思路:
1、如果必须使用,可以考虑拆分表,把BLOB、TEXT字段分离到单独的表中。
2、如果有许多大字段,可以考虑合并这些字段到一个字段,存储一个大200KB比存储20个10KB更有效。
3、考虑使用COMPRESS(),再存储。
好了,今天的分享就到这里吧,另外更多运维、开发分享请关注右上角头条号。
今天文末福利,关注并私信:
2019年最新的《java开发版商城》的教学资料,大概看了下,讲得不错,跟商城有关的技术栈都涉及到了,比较完整,20多个G。
将此文章转发给你最重要的十个朋友, 在你最需要帮助的时候,你会多十双援手,在此感谢您!
-
无人机反制简谈
2019-03-09 14:32:33因此,对无人机的防控及反制系统产品应运而生,该系统主要完成对“低、慢、小”目标的侦测、诱骗、压制、驱离,同时在显示终端实时全程跟踪。目前,大多数的反制系统可实现在2.4G\5.8G\GPS\GLONASS等多频段范围侦测...随着人们的收入不断提高,以往只有航模爱好者玩的低空小飞机,也越来越普及,这也引起了各种安全事故,如操作不当发生误砸伤人、在机场附近随意放飞影响航班起降等。因此,对无人机的防控及反制系统产品应运而生,该系统主要完成对“低、慢、小”目标的侦测、诱骗、压制、驱离,同时在显示终端实时全程跟踪。目前,大多数的反制系统可实现在2.4G\5.8G\GPS\GLONASS等多频段范围侦测大于5km,干扰驱离大于1km的功能,基本满足市场需求!仅供参考!
-
python应对反爬虫策略_浅谈Scrapy框架普通反爬虫机制的应对策略
2020-12-15 22:01:34而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小。爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页上...简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小。
爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页上的数据被爬虫爬走。然而,如果反爬机制过于严格,可能会误伤到真正的用户请求;如果既要和爬虫死磕,又要保证很低的误伤率,那么又会加大研发的成本。
简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小。所以,网站反爬的重点也是那种简单粗暴的爬虫,反爬机制也会允许伪装度高的爬虫,获得数据。毕竟伪装度很高的爬虫与真实用户也就没有太大差别了。
这篇文章主要讨论使用Scrapy框架时,如何应对普通的反爬机制。
header检验
最简单的反爬机制,就是检查HTTP请求的Headers信息,包括User-Agent,Referer、Cookies等。
User-Agent
User-Agent是检查用户所用客户端的种类和版本,在Scrapy中,通常是在下载器中间件中进行处理。比如在setting.py中建立一个包含很多浏览器User-Agent的列表,然后新建一个random_user_agent文件:
class RandomUserAgentMiddleware(object): @classmethod defprocess_request(cls, request, spider): ua = random.choice(spider.settings['USER_AGENT_LIST']) if ua: request.headers.setdefault('User-Agent', ua)
这样就可以在每次请求中,随机选取一个真实浏览器的User-Agent。
Referer
Referer是检查此请求由哪里来,通常可以做图片的盗链判断。在Scrapy中,如果某个页面url是通过之前爬取的页面提取到,Scrapy会自动把之前爬取的页面url作为Referfer。也可以通过上面的方式自己定义Referfer字段。
Cookies
网站可能会检测Cookie中session_id的使用次数,如果超过限制,就触发反爬策略。所以可以在Scrapy中设置COOKIES_ENABLED=False让请求不带Cookies。
也有网站强制开启Cookis,这时就要麻烦一点了。可以另写一个简单的爬虫,定时向目标网站发送不带Cookies的请求,提取响应中Set-cookie字段信息并保存。爬取网页时,把存储起来的Cookies带入Headers中。
X-Forwarded-For
在请求头中添加X-Forwarded-For字段,将自己申明为一个透明的代理服务器,一些网站对代理服务器会手软一些。
X-Forwarded-For头一般格式如下
X-Forwarded-For:client1,proxy1,proxy2
这里将client1,proxy1设置为随机IP地址,把自己的请求伪装成代理的随机IP产生的请求。然而由于X-Forwarded-For可以随意篡改,很多网站并不会信任这个值。
限制IP的请求数量
如果某一IP的请求速度过快,就触发反爬机制。当然可以通过放慢爬取速度绕过,这要以爬取时间大大增长为代价。另一种方法就是添加代理。
很简单,在下载器中间件中添加:
request.meta['proxy'] = 'http://' + 'proxy_host' + ':' + proxy_port
然后再每次请求时使用不同的代理IP。然而问题是如何获取大量的代理IP?
可以自己写一个IP代理获取和维护系统,定时从各种披露免费代理IP的网站爬取免费IP代理,然后定时扫描这些IP和端口是否可用,将不可用的代理IP及时清理。这样就有一个动态的代理库,每次请求再从库中随机选择一个代理。然而这个方案的缺点也很明显,开发代理获取和维护系统本身就很费时费力,并且这种免费代理的数量并不多,而且稳定性都比较差。如果必须要用到代理,也可以去买一些稳定的代理服务。这些服务大多会用到带认证的代理。
在requests库中添加带认证的代理很简单,
proxies = { "http": "http://user:pass@10.10.1.10:3128/", }
然而Scrapy不支持这种认证方式,需要将认证信息base64编码后,加入Headers的Proxy-Authorization字段:
importbase64 # Set the location of the proxy proxy_string = choice(self._get_proxies_from_file('proxies.txt')) # user:pass@ip:port proxy_items = proxy_string.split('@') request.meta['proxy'] = "http://%s" % proxy_items[1] # setup basic authentication for the proxy user_pass=base64.encodestring(proxy_items[0]) request.headers['Proxy-Authorization'] = 'Basic ' + user_pass
动态加载
现在越来越多的网站使用ajax动态加载内容,这时候可以先截取ajax请求分析一下,有可能根据ajax请求构造出相应的API请求的URL就可以直接获取想要的内容,通常是json格式,反而还不用去解析HTML。
然而,很多时候ajax请求都会经过后端鉴权,不能直接构造URL获取。这时就可以通过PhantomJS+Selenium模拟浏览器行为,抓取经过js渲染后的页面。
需要注意的是,使用Selenium后,请求不再由Scrapy的Downloader执行,所以之前添加的请求头等信息都会失效,需要在Selenium中重新添加
headers = {...} for key, valuein headers.iteritems(): webdriver.DesiredCapabilities.PHANTOMJS['phantomjs.page.customHeaders.{}'.format(key)] = value
另外,调用PhantomJs需要指定PhantomJs的可执行文件路径,通常是将该路径添加到系统的path路径,让程序执行时自动去path中寻找。我们的爬虫经常会放到crontab中定时执行,而crontab中的环境变量和系统的环境变量不同,所以就加载不到PhamtonJs需要的路径,所以最好是在申明时指定路径:
driver = webdriver.PhantomJS(executable_path='/usr/local/bin/phantomjs')
总结
以上就是本文关于浅谈Scrapy框架普通反爬虫机制的应对策略的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
-
浅谈Scrapy框架普通反爬虫机制的应对策略
2020-12-23 18:47:22而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小。 爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页... -
航天科工自行研发“反无人机”系统,综合拦截成功率高达80%
2018-03-13 16:25:00该系统对低空慢速的小目标实行空中拦截。 ...据了解,中国航天科工集团公司二院206所自主研制了一套名叫“天网一号”的低慢小航空器拦截系统,能够对“低空、慢速、小目标”实现全空域...该系统对低空慢速的小目标实行空中拦截。
近些日子以来,由于擅闯机场等事件的发生,无人机“黑飞”一直受到人们的关注,而对于其中的“反无人机”,也有不少团队正在进行开发并取得了相关成绩。
据了解,中国航天科工集团公司二院206所自主研制了一套名叫“天网一号”的低慢小航空器拦截系统,能够对“低空、慢速、小目标”实现全空域探测与高精度跟踪,并采用网式拦截,综合拦截成功率可达80%,为整治无人机“黑飞”乱象提供了新选择。
项目负责人之一、航天科工二院206所军民融合总体研究室副主任申研介绍,该系统具有无烟、无焰、无光、微声,集全空域探测与高精度跟踪于一体等特点,突破了低特征高精度网式拦截技术、高速动态开网技术等多项关键技术,可减小在城市环境中使用对人群、楼宇的附带伤害,是一种对环境和社会影响较小的高效拦截方式。
目前,为了对付那些违法违规的“黑飞”无人机,多个国家都推出了相关的措施,比如大网或是老鹰等等,在这些传统方法之外也有一些特制的高科技枪炮等等。相比较而言,国内航天科工二院206所军所研发的系统在全球还算是相当不错的。
原文发布时间:2017-05-20 09:16本文作者:韩璐本文来自云栖社区合作伙伴镁客网,了解相关信息可以关注镁客网。 -
元器件应用中的小东西大作用 什么样的变压器最好
2020-11-23 15:55:32手工绕制可以将变压器的漏磁做得非常小,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率低、速度慢。 二、环型、EI型、R型、C型几种... -
小日本视频转换器
2011-11-07 16:03:30这个参数是至关重要的,设置反了会造成生成图象的明显闪动,打个比方,一个物体的运动位置次序本来是1-2-3-4-5-6 -……,设置反了以后就成了2-1-4-3-6-5-8……对于模拟视频源,其场序是由捕捉卡类型决定的,对于dv,... -
【雷达装备】A800 无人机探测雷达
2021-01-21 16:27:20它的设计是为了应对当前低慢小(LSS)目标的威胁(包括常用的“大疆幻影”式四轴飞行器)。 为了进一步提高系统性能,A800具有智能微多普勒目标滤波功能,这减少了误报,有助于提高对多翼无人机... -
变压器选用中的几点问题
2020-10-23 13:13:47机器绕制变压器的优点是效率高且外观...手工绕制可以将变压器的漏磁做得非常小,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率低、速度慢。 -
反向传播常用优化器
2018-11-04 14:30:00计算出损失值后,这个损失值越小越好,梯度下降的算法就用在这里,帮助寻找最小的那个损失值,从而反推出 w 和 b 达到优化模型的效果 常用的梯度下降法可以分为: 批量梯度下降:遍历全部数据集算一次损失,计算量大,计算... -
元器件应用中的什么样的变压器最好
2020-11-22 12:40:06手工绕制可以将变压器的漏磁做得非常小,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率低、速度慢。 二、环型、EI型、R型、C型几种... -
电源技术中的电源变压器的比较
2020-11-08 01:21:12手工绕制可以将变压器的漏磁做得非常小,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率低、速度慢。 二、环型、EI型、R型、C型几种... -
高性能MySQL读书摘要(三)Schema与数据类型优化
2020-06-30 00:18:30例如,反范式的设计可以加快某些类型的查询,但是同时会使另一些类型的查询变慢。 4.1 选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。 更小的通常更好:一般情况下,... -
Mysql 部分优化
2018-11-15 14:13:08范式设计的表通常比较小,可以更好的利用内存的优势,提高我们的检索速度 缺点: 经过范式设计出来的表,会很多,越严格来遵循,表就越多 多表关联会慢,可能会导致索引失效 范式越高,对操作性能可能就越低... -
感知哈希算法
2020-11-04 18:13:43pHash则反其道而行之,精确度较高但速度较慢;dHash兼顾二者,精确度较高且速度较快。 在得到64位hash值后,使用汉明距离量化两张图像的相似性。汉明距离越大,图像的相似度越小,汉明距离越小,图像的相似度越大。 -
恒指赵鑫:8.9恒指德指实盘指导记录总结与晚盘前瞻
2019-08-09 16:36:50今日小结: ①行情回顾:恒指周五早盘低开高走,一轮快速冲高26200一线开始区间震荡回落,上证开盘维持这个区间震荡较长时间。后续一轮下破均线支撑后换位跌势区间下调,再次维持区间震荡一段时间,尾盘阶段行情迅速... -
优秀程序员涨薪留公司,普通程序员跳槽腾讯,5年后对比收入懵了
2020-08-04 16:40:31职场上,其实薪资不一定能够反映个人的真实水平,不一定说你工资高就能力强,也不是工资低的人就一定能力差。...而部门还有另外一个员工,学东西很慢,工作上也是经常出错,领导不但不给涨工资,反 -
用万用表(机械表)电阻档判断电容器的好坏
2020-07-11 17:47:402、用万用表判断电解电容器的正、负引线一些耐压较低的电解电容器,如果正、负引线标志不清时, 可根据它的正接时漏电电流小(电阻值大),反接时漏电电流大的特性来判断。具体方法是:用红、黑表笔接触电容器的两引线... -
电源变压器的比较.docx
2019-09-14 15:53:07手工绕制可以将变压器的漏磁做得非常小,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率低、速度慢。 二、环型、EI型、R型、C型几种... -
2016年电子设计大赛省赛论文
2018-08-14 13:56:33没有光照时,反 向电流很小,称为暗电流。当有红外线光照时,携带能量的 红外线光子进入 PN 结后,把能量传给共价键上的束缚电子, 使部分电子挣脱共价键,从而产生电子——空穴对,它们在 反向电压作用下参加漂移... -
LM77规格书.PDF
2020-07-02 17:39:04GND,TXD,RXD,KEY引脚、蓝牙连接状态引出脚(STATE),未连接输出低,连接后输出高#led指示蓝牙连接状态,红蓝灯一起快闪表示没有蓝牙连接,慢闪表示蓝牙已连接并打开了端口#底板设置防反接二极管,带3.3V LDO,输入... -
LM76规格书.PDF
2020-07-02 17:27:29GND,TXD,RXD,KEY引脚、蓝牙连接状态引出脚(STATE),未连接输出低,连接后输出高#led指示蓝牙连接状态,红蓝灯一起快闪表示没有蓝牙连接,慢闪表示蓝牙已连接并打开了端口#底板设置防反接二极管,带3.3V LDO,输入... -
supercache3.02服务版和桌面版含注册机
2009-01-20 01:41:37在计算机系统中硬盘被认为是极慢的设备之一。SuperCache II和SuperVolume把硬盘经常用到或频繁用到的硬盘数据放到内存里,从而极剧加快了程序和服务器的运动速度。 当所要加速的数据量大于有效的系统内存时可选用... -
持续交付-发布可靠软件的系统方法
2014-03-02 01:32:14Jez Humble编著的《持续交付(发布可靠软件的系统方法)》讲述如何实现更快、更可靠、低成本的自动化软件交付,描述了如何通过增加反馈,并改进开发人员、测试人员、运维人员和项目经理之间的协作来达到这个目标。... -
rar压缩软件.rar
2016-02-13 10:52:44在 RAR 变量中的开关 低优先级 保存在配置文件中的开关 最低优先级 日志文件 ~~~~~~~~ 如果在命令行或配置文件中指定开关 -ilog ,RAR 将会把处理压缩文件中遇到的错误 等写到日志文件中。读取开关 -ilog ... -
xml与反射.txt
2020-08-05 14:39:17只要给定类的名字,就可以通过反 射获取类的所有信息,接着便能调用它的任何一个方法和属性。 反射的步骤有哪些? 第一:获取类加载器:ClassLoader loader=Thread.currentThread().getContextClassLoader();//获取... -
变频原理介绍与变频驱动
2009-05-20 21:32:18而变频空调则可以很好地解决这一难题,变频空调采用超低频进行启动,此时启动电流尚不及正常的运转电流,且一开始压缩机运转功率比较低,使之可以顺利启动,这时对电网的冲击小,从而保证了电表和电网上其他电器能... -
讯浪安全浏览器 v6.2.zip
2019-07-17 05:25:03极小的资源占用,同时访问多个页面消耗系 统内存极小; 2、 先进而优良的过滤功能,包括各种弹窗过滤、页面元素过滤和网页对话框过滤等; 3、 支持高速跨网段访问、高速下载文件、避免迅雷等下载软件拖慢网速...