精华内容
下载资源
问答
  • 一般数据量少的时候,连接开不大,一般不会有性能问题,当数据量变大后,那么性能问题就会比较突出。所以在数据库初期最好能确定哪个表能成为大表,然后进行范式设计减少连接的表,例如增加冗余字段等等,或者在...
    ca6ce23030cd8af5a426644484954974.png

    连接查询的优化

    无论什么数据库,多表连接的查询成本都是比较高的,因此对于高并发应用,应该尽量减少有连接的查询,多表连接的个数不要超过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。

    1b230098a9a00e99572c8d0f429a213e.png

    将此文章转发给你最重要的十个朋友, 在你最需要帮助的时候,你会多十双援手,在此感谢您!

    展开全文
  • 无人机制简谈

    2019-03-09 14:32:33
    因此,对无人机的防控及制系统产品应运而生,该系统主要完成对“”目标的侦测、诱骗、压制、驱离,同时在显示终端实时全程跟踪。目前,大多数的制系统可实现在2.4G\5.8G\GPS\GLONASS等多频段范围侦测...

    随着人们的收入不断提高,以往只有航模爱好者玩的低空小飞机,也越来越普及,这也引起了各种安全事故,如操作不当发生误砸伤人、在机场附近随意放飞影响航班起降等。因此,对无人机的防控及反制系统产品应运而生,该系统主要完成对“低、慢、小”目标的侦测、诱骗、压制、驱离,同时在显示终端实时全程跟踪。目前,大多数的反制系统可实现在2.4G\5.8G\GPS\GLONASS等多频段范围侦测大于5km,干扰驱离大于1km的功能,基本满足市场需求!仅供参考!

    展开全文
  • 而伪装度高的爬虫爬取速度,对服务器造成的负担也相对较。爬虫与爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了爬虫机制,防止网页上...

    简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小。

    爬虫与反爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了反爬虫机制,防止网页上的数据被爬虫爬走。然而,如果反爬机制过于严格,可能会误伤到真正的用户请求;如果既要和爬虫死磕,又要保证很低的误伤率,那么又会加大研发的成本。

    简单低级的爬虫速度快,伪装度低,如果没有反爬机制,它们可以很快的抓取大量数据,甚至因为请求过多,造成服务器不能正常工作。而伪装度高的爬虫爬取速度慢,对服务器造成的负担也相对较小。所以,网站反爬的重点也是那种简单粗暴的爬虫,反爬机制也会允许伪装度高的爬虫,获得数据。毕竟伪装度很高的爬虫与真实用户也就没有太大差别了。

    这篇文章主要讨论使用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框架普通反爬虫机制的应对策略的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

    如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

    展开全文
  • 而伪装度高的爬虫爬取速度,对服务器造成的负担也相对较。 爬虫与爬虫,这相爱相杀的一对,简直可以写出一部壮观的斗争史。而在大数据时代,数据就是金钱,很多企业都为自己的网站运用了爬虫机制,防止网页...
  • 该系统对低空慢速的小目标实行空中拦截。 ...据了解,中国航天科工集团公司二院206所自主研制了一套名叫“天网一号”的低慢小航空器拦截系统,能够对“低空、慢速、小目标”实现全空域...

    该系统对低空慢速的小目标实行空中拦截。

    航天科工自行研发反无人机系统,综合拦截成功率高达80%

    近些日子以来,由于擅闯机场等事件的发生,无人机“黑飞”一直受到人们的关注,而对于其中的“反无人机”,也有不少团队正在进行开发并取得了相关成绩。

    据了解,中国航天科工集团公司二院206所自主研制了一套名叫“天网一号”的低慢小航空器拦截系统,能够对“低空、慢速、小目标”实现全空域探测与高精度跟踪,并采用网式拦截,综合拦截成功率可达80%,为整治无人机“黑飞”乱象提供了新选择。

    项目负责人之一、航天科工二院206所军民融合总体研究室副主任申研介绍,该系统具有无烟、无焰、无光、微声,集全空域探测与高精度跟踪于一体等特点,突破了低特征高精度网式拦截技术、高速动态开网技术等多项关键技术,可减小在城市环境中使用对人群、楼宇的附带伤害,是一种对环境和社会影响较小的高效拦截方式。

    目前,为了对付那些违法违规的“黑飞”无人机,多个国家都推出了相关的措施,比如大网或是老鹰等等,在这些传统方法之外也有一些特制的高科技枪炮等等。相比较而言,国内航天科工二院206所军所研发的系统在全球还算是相当不错的。


    原文发布时间:2017-05-20 09:16
    本文作者:韩璐
    本文来自云栖社区合作伙伴镁客网,了解相关信息可以关注镁客网。
    展开全文
  • 手工绕制可以将变压器的漏磁做得非常,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的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,...
  • 它的设计是为了应对当前低慢小(LSS)目标的威胁(包括常用的“大疆幻影”式四轴飞行器)。 为了进一步提高系统性能,A800具有智能微多普勒目标滤波功能,这减少了误报,有助于提高对多翼无人机...
  • 机器绕制变压器的优点是效率高且外观...手工绕制可以将变压器的漏磁做得非常,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率、速度
  • 反向传播常用优化器

    2018-11-04 14:30:00
    计算出损失值后,这个损失值越小越好,梯度下降的算法就用在这里,帮助寻找最小的那个损失值,从而推出 w 和 b 达到优化模型的效果 常用的梯度下降法可以分为: 批量梯度下降:遍历全部数据集算一次损失,计算量大,计算...
  • 手工绕制可以将变压器的漏磁做得非常,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率、速度。  二、环型、EI型、R型、C型几种...
  • 手工绕制可以将变压器的漏磁做得非常,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率、速度。  二、环型、EI型、R型、C型几种...
  • 例如,范式的设计可以加快某些类型的查询,但是同时会使另一些类型的查询变。 4.1 选择优化的数据类型 MySQL支持的数据类型非常多,选择正确的数据类型对于获得高性能至关重要。 更的通常更好:一般情况下,...
  • Mysql 部分优化

    2018-11-15 14:13:08
    范式设计的表通常比较,可以更好的利用内存的优势,提高我们的检索速度 缺点: 经过范式设计出来的表,会很多,越严格来遵循,表就越多 多表关联会,可能会导致索引失效 范式越高,对操作性能可能就越...
  • 感知哈希算法

    2020-11-04 18:13:43
    pHash则其道而行之,精确度较高但速度较;dHash兼顾二者,精确度较高且速度较快。 在得到64位hash值后,使用汉明距离量化两张图像的相似性。汉明距离越大,图像的相似度越,汉明距离越,图像的相似度越大。
  • 今日结: ①行情回顾:恒指周五早盘开高走,一轮快速冲高26200一线开始区间震荡回落,上证开盘维持这个区间震荡较长时间。后续一轮下破均线支撑后换位跌势区间下调,再次维持区间震荡一段时间,尾盘阶段行情迅速...
  • 职场上,其实薪资不一定能够反映个人的真实水平,不一定说你工资高就能力强,也不是工资的人就一定能力差。...而部门还有另外一个员工,学东西很,工作上也是经常出错,领导不但不给涨工资,
  • 2、用万用表判断电解电容器的正、负引线一些耐压较的电解电容器,如果正、负引线标志不清时, 可根据它的正接时漏电电流(电阻值大),接时漏电电流大的特性来判断。具体方法是:用红、黑表笔接触电容器的两引线...
  • 手工绕制可以将变压器的漏磁做得非常,其在绕制过程中能针对线圈匝数的布局随时予以调整,所以真正的Hi–END变压器一定是纯手工绕制,纯手工绕制的唯一缺点是效率、速度。 二、环型、EI型、R型、C型几种...
  • 没有光照时, 向电流很,称为暗电流。当有红外线光照时,携带能量的 红外线光子进入 PN 结后,把能量传给共价键上的束缚电子, 使部分电子挣脱共价键,从而产生电子——空穴对,它们在 反向电压作用下参加漂移...
  • LM77规格书.PDF

    2020-07-02 17:39:04
    GND,TXD,RXD,KEY引脚、蓝牙连接状态引出脚(STATE),未连接输出,连接后输出高#led指示蓝牙连接状态,红蓝灯一起快闪表示没有蓝牙连接,闪表示蓝牙已连接并打开了端口#底板设置防接二极管,带3.3V LDO,输入...
  • LM76规格书.PDF

    2020-07-02 17:27:29
    GND,TXD,RXD,KEY引脚、蓝牙连接状态引出脚(STATE),未连接输出,连接后输出高#led指示蓝牙连接状态,红蓝灯一起快闪表示没有蓝牙连接,闪表示蓝牙已连接并打开了端口#底板设置防接二极管,带3.3V LDO,输入...
  • 在计算机系统中硬盘被认为是极的设备之一。SuperCache II和SuperVolume把硬盘经常用到或频繁用到的硬盘数据放到内存里,从而极剧加快了程序和服务器的运动速度。 当所要加速的数据量大于有效的系统内存时可选用...
  • 持续交付-发布可靠软件的系统方法

    热门讨论 2014-03-02 01:32:14
    Jez 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();//获取...
  • 而变频空调则可以很好地解决这一难题,变频空调采用超低频进行启动,此时启动电流尚不及正常的运转电流,且一开始压缩机运转功率比较,使之可以顺利启动,这时对电网的冲击,从而保证了电表和电网上其他电器能...
  • 的资源占用,同时访问多个页面消耗系 统内存极;  2、 先进而优良的过滤功能,包括各种弹窗过滤、页面元素过滤和网页对话框过滤等;  3、 支持高速跨网段访问、高速下载文件、避免迅雷等下载软件拖网速...

空空如也

空空如也

1 2 3 4
收藏数 65
精华内容 26
关键字:

反低慢小