首页 文章 精选 留言 我的

精选列表

搜索[TDP云声计划],共10000篇文章
优秀的个人博客,低调大师

数据库设计与优化 - 结合执行计划MySQL语句的11大优化策略

背景 全球访问量最大的 20 家网站,绝大多数使用 MySQL,有两个特例的 live.com 和 bing 是微软旗下的网站。它使用的是 MSSQL,并不是他们使用不了 MySQL,而是他要支持自己的数据库。毫无疑问MySQL是当今非常流行的关系数据库之一,不仅因为其绝大多数版本的开源,而且支持多存储引擎、快速、稳定地运行于各种服务器环境。MySQL查询分析优化引擎作为其中核心模块的一部分,占有举足轻重的地位,因此我们今天了解和研究它就非常重要了。 MySQL服务器操作层架构 MySQL语句的优化就发生MySQL Server服务器架构的操作层,这层具体的执行流程是: 这层主要的功能是: SQL 语句的解析、优化,缓存的查询,MySQL 内置函数的实现,跨存储引擎功能(所谓跨存储引擎就是说每个引擎都需提供的功能(引擎需对外提供接口)),例如:存储过程、触发器、视图等。 1.如果是查询语句(select 语句),首先会查询缓存是否已有相应结果,有则返回结果,无则进行下一步(如果不是查询语句,同样调到下一步); 2.解析查询,创建一个内部数据结构(解析树),这个解析树主要用来 SQL 语句的语义与语法解析; 3.优化:优化 SQL 语句,例如重写查询,决定表的读取顺序,以及选择需要的索引等。这一阶段用户是可以查询的,查询服务器优化器是如何进行优化的,便于用户重构查询和修改相关配置,达到最优化。这一阶段还涉及到存储引擎,优化器会询问存储引擎,比如某个操作的开销信息、是否对特定索引有查询优化等。 十一大优化策略 演示准备 用以上演示道具来说明十一经典优化策略如下: 策略一、索引字段尽量全值匹配 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `name`='joye'; -- 走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE `name`='joye' AND age=25; -- 走索引 -- 查询3 EXPLAIN SELECT * FROM employee WHERE `NAME`='joye' AND age=25 AND pos='dev'; -- 走索引 以上三种查询方式,查询3的效率最高,索引的使用程度也最高。在表中建立索引后,能用索引的要尽量都要用上。 策略二、最佳左前缀法则 如果创建的索引为复合索引,要遵守最左前缀法则。查询从索引的最左前列开始并且不要跳过索引中的列。 -- 查询1 EXPLAIN SELECT * FROM employee WHERE age=20 AND pos='dev'; -- 不走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE pos='dev'; -- 不走索引 -- 查询3 EXPLAIN SELECT * FROM employee WHERE `name`='Joye'; -- 走索引 以上查询只有查询3才走索引。最佳左前缀法则可以理解成火车的车头、中间车厢、车尾的关系。 策略三、不在索引列上做任何操作 在索引列上计算、函数、类型转换等会导致索引失效,转向全表扫描。 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `name`='Joye'; -- 走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE LEFT(`name`,4)='Joye'; -- 不走索引 -- 查询3 EXPLAIN SELECT * FROM employee WHERE `age`*2 = 13; -- 不走索引 在索引字段上使用函数、任何计算表达式均会导致索引失效。 策略四、尽量多用覆盖索引 尽量使用覆盖索引(只访问索引列的查询,查询列和索引列一致),减少select开销。全部数据直接通过索引就能获取到,大大提高查询效率。 -- 查询1 EXPLAIN SELECT age,pos FROM employee WHERE `name` = 'joye'; -- 走索引 -- 查询2 EXPLAIN SELECT pos FROM employee WHERE `name` = 'joye'; -- 走索引 -- 查询3 EXPLAIN SELECT age,add_time FROM employee WHERE `name` = 'joye'; -- 不走索引 策略五、范围条件放最后 查询优化器不会使用索引中范围条件右边的列,所以范围条件放最后能被主动采用。 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `NAME`='joye' AND age=22 AND pos='manager'; -- 走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE `NAME`='joye' AND age>22 AND pos='manager';-- 不充分走索引 -- 查询3 EXPLAIN SELECT * FROM employee WHERE `NAME`='joye' AND pos='manager' AND age>22; -- 充分走索引 策略六、不等于(! <>) 要慎用 mysql在使用不等于(!= 或者 <>)的时候无法使用索引,导致全表扫描 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `name` != 'joye'; -- 不走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE NAME <>'joye'; -- 不走索引 若要使用不等号,尽量采用覆盖索引; -- 查询3 EXPLAIN SELECT `name`,age,pos FROM employee WHERE NAME != 'joye'; -- 走索引 -- 查询4 EXPLAIN SELECT NAME,age,pos FROM employee WHERE NAME <> 'joye'; -- 走索引 策略七、IN/NOT IN要慎用 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `name` IN('joye','9000'); -- 不走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE `name` NOT IN('joye','9000'); -- 不走索引 查询1和查询2不走索引的原因是IN/NOT IN 匹配让索引失效,转向全表扫描 。若需要使用IN/NOT IN,则同时尽量采用覆盖索引或就使用场景使用JOIN连表方式 -- 查询3 EXPLAIN SELECT age,pos FROM employee WHERE `name` IN('joye','9000'); -- 走索引 -- 查询4 EXPLAIN SELECT age,pos FROM employee WHERE `name` NOT IN('joye','9000');-- 充分使用索引 策略八、NULL/NOT NULL有影响 索引字段为null 和 not null 对索引的影响, 可能导致索引失效(分情况)。 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `name` IS NULL; -- 不走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE `name` IS NOT NULL; -- 不走索引 这时设置`name`字段允许为null -- 查询3 EXPLAIN SELECT * FROM employee2 WHERE NAME IS NULL; -- 走索引 策略九、LIKE查询要小心 LIKE以通配符开头(‘%abc ’)mysql索引失效会变成全表扫描操作。 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `name` LIKE '%july%' -- 不走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE `name` LIKE '%july' -- 不走索引 -- 查询3 EXPLAIN SELECT * FROM employee WHERE `name` LIKE 'july%'-- 走索引 策略十、字符类型字段加引号 字符窜不加引号会导致索引失效。 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `name` = 9000; -- 不走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE `name` = '9000' -- 走索引 策略十一、OR改UNION 效率高 WHERE查询或子查询条件中使用OR,会导致索引失效,转向全表数据扫描。 -- 查询1 EXPLAIN SELECT * FROM employee WHERE `name`='joye' OR `name`='andy3'; -- 不走索引 -- 查询2 EXPLAIN SELECT * FROM employee WHERE `name`='joye' UNION SELECT * FROM employee WHERE `name`='andy3'; -- 走索引 总结 以上仅为SQL语句优化领域的关键优化指标和技巧。在具体项目的优化中,我们可能会综合使用以上多个策略和手段完成一个SQL的优化;如何用好这些策略完全取决于我们在项目实战中循序渐进的优化、尝试、摸索、总结。以后会在项目实践中,分享更多综合性大数据问题优化实战案例,请继续关注!

优秀的个人博客,低调大师

关于项目自动化测试架构的改良计划 - 对于内容文件动作指令信息

我们分为3个方法依次对于<add_elements>,<update_elements>,<remove_elements>进行解析: 对于<add_elements>内部遍历解析的代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 /** * add the new information which configured in original xml and finally generate the new xml */ publicstaticString addElementToXML(String xmlString ,XMLModifyInfoExtractor extractor,String originalFilePath) throwsException{ Document doc = null ; doc = DocumentHelper.parseText(xmlString); extractor.extractModifyInfo(originalFilePath); //All the add information are provided by XMLModifyInfoExtractor List<AddElement> addElementInfoList = extractor.getAddElementInfoList(); List<Node> nodes ; for (AddElement addElement : addElementInfoList){ String testcaseXPath =addElement.getTestcaseXPath(); String path =addElement.getPath(); String value=addElement.getValue(); //make the value as a Element block Element newElementSnippet = DocumentHelper.parseText(value).getRootElement(); nodes = doc.selectNodes(path); for (Node node :nodes){ //if in the node is in matching testcase ,then remove it String nodeUniquePath = node.getUniquePath(); if (nodeUniquePath.indexOf(testcaseXPath) !=- 1 ){ //node.getParent().remove(node); //node.setText(value); Element addingPointElement = (Element) node; addingPointElement.add(newElementSnippet); } } } returndoc.asXML(); } 对于<update_elements>内部元素进行遍历的代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 /** * update the information which configured in original xml and finally generate the new xml */ publicstaticString updateElementFromXML(String xmlString ,XMLModifyInfoExtractor extractor,String originalFilePath) throwsException{ Document doc = null ; doc = DocumentHelper.parseText(xmlString); extractor.extractModifyInfo(originalFilePath); //All the update information are provided by XMLModifyInfoExtractor List<UpdateElement> updateElementInfoList = extractor.getUpdateElementInfoList(); List<Node> nodes ; for (UpdateElement updateElement : updateElementInfoList){ String testcaseXPath =updateElement.getTestcaseXPath(); String path =updateElement.getPath(); String value=updateElement.getValue(); nodes = doc.selectNodes(path); for (Node node :nodes){ //if in the node is in matching testcase ,then remove it String nodeUniquePath = node.getUniquePath(); if (nodeUniquePath.indexOf(testcaseXPath) !=- 1 ){ node.setText(value); } } } returndoc.asXML(); } 对于<remove_elements>中元素进行遍历解析的代码如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 /** * remove the information which configured in original xml and finally generate the new xml */ publicstaticString removeElementFromXML(String xmlString ,XMLModifyInfoExtractor extractor,String originalFilePath) throwsException{ Document doc = null ; doc = DocumentHelper.parseText(xmlString); extractor.extractModifyInfo(originalFilePath); //All the remove information are provided by XMLModifyInfoExtractor List<RemoveElement> removeElementInfoList = extractor.getRemoveElementInfoList(); List<Node> nodes ; for (RemoveElement removeElement : removeElementInfoList){ String testcaseXPath =removeElement.getTestcaseXPath(); String path =removeElement.getPath(); nodes = doc.selectNodes(path); for (Node node :nodes){ //if in the node is in matching testcase ,then remove it String nodeUniquePath = node.getUniquePath(); if (nodeUniquePath.indexOf(testcaseXPath) !=- 1 ){ node.getParent().remove(node); } } } returndoc.asXML(); } 最后,当执行3步骤动作系列转化之后,最终的xml文件就是包含最终的我们修改后的结果了。 本文转自 charles_wang888 51CTO博客,原文链接:http://blog.51cto.com/supercharles888/1221752,如需转载请自行联系原作者

优秀的个人博客,低调大师

消息称软银计划234亿英镑收购Arm公司 孙正义巨额押注物联网

据金融时报报道,日本软银公司(Softbank)已经同意以234亿英镑的价格收购英国芯片设计公司Arm,这是这家日本电信集团又一次巨大的赌注,该公司希望通过此次收购Arm使其能够成为未来物联网市场的一个领导者。 两位知情人士透露称,这笔交易将在本周一上午进行宣布。软银和Arm均未立即对此发表评论。 软银对Arm公司的收购,将成为欧洲科技行业有史以来最大的一笔收购交易。软银将向Arm支付每股17英镑,较Arm上周的收盘价格溢价43%。 作为在芯片设计领域的一家全球领先公司,脱欧并未对Arm造成太大的影响,因为该公司的财报以美元进行计算。此外,这一交易消息发生在英国公投脱欧仅几周后的时间。脱欧导致英镑持续下跌,目前英镑较日元与过去一年相比已经下跌了近30%,从而使Arm成为一个极具吸引力的目标。过去12个月,Arm公司的股价基本持稳。 图:软银董事长孙正义 就在几周前,软银总裁Nikesh Arora突然宣布辞职。软银董事长孙正义已将软银打造为一个庞大的全球电信和媒体集团,市值680亿美元,并且该公司持有美国第四大移动运营商的多数股权以及日本最受欢迎的互联网搜索引擎雅虎日本的多数股权。 数据显示,过去十年来,软银已经参与了140多笔交易,总价值超过820亿美元。其中大部分交易都是在最近四年里由Nikesh Arora进行执行的,Nikesh Arora参与了一系列的交易,从收购一些默默无闻的初创公司价值几百万美元的少数股权,到收购一些快速成长的公司价值数十亿美元的投资。 通常,Arm在业界被视为是全球最大的芯片制造商英特尔公司的一个潜在收购目标。 作为一个纯粹的芯片设计厂商而非制造商,Arm的知识产权模式使其无法实现过高的利润率。不过,去年该公司的收入约为10亿英镑。软银此次的收购价格相当于Arm去年净利润的70倍,同时也高于Arm去年EBITDA的50倍。 ====================================分割线================================ 本文转自d1net(转载)

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Rocky Linux

Rocky Linux

Rocky Linux(中文名:洛基)是由Gregory Kurtzer于2020年12月发起的企业级Linux发行版,作为CentOS稳定版停止维护后与RHEL(Red Hat Enterprise Linux)完全兼容的开源替代方案,由社区拥有并管理,支持x86_64、aarch64等架构。其通过重新编译RHEL源代码提供长期稳定性,采用模块化包装和SELinux安全架构,默认包含GNOME桌面环境及XFS文件系统,支持十年生命周期更新。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

用户登录
用户注册