精华内容
下载资源
问答
  • 哪些情况效率低呢?”陈小哈:“SELECT * 它好像比写指定列名多一次全表查询吧,还多查了一些无用的字段。”面试官:“嗯...”陈小哈:“emmm~ 没了”陈小哈:“....??(几个意思)”面试官:“嗯...好,那你...

    29af7366b7832cd038e2de8d4f1494bd.png
    面试官:“小陈,说一下你常用的SQL优化方式吧。”
    陈小哈:“那很多啊,比如不要用SELECT *,查询效率低。巴拉巴拉...”
    面试官:“为什么不要用SELECT * ?它在哪些情况下效率低呢?”
    陈小哈:“SELECT * 它好像比写指定列名多一次全表查询吧,还多查了一些无用的字段。”
    面试官:“嗯...”
    陈小哈:“emmm~ 没了”
    陈小哈:“....??(几个意思)”
    面试官:“嗯...好,那你还有什么要问我的么?”
    陈小哈:“我问你个锤子,把老子简历还我!”

    69ca1c84e05f6f1757c6509ab7ccea0f.png

    无论在工作还是面试中,关于SQL中不要用“SELECT *”,都是大家听烂了的问题,虽说听烂了,但普遍理解还是在很浅的层面,并没有多少人去追根究底,探究其原理。

    废话不多说,本文带你深入了解一下"SELECT * "效率低的原因及场景。

    本文很干!请自备茶水,没时间看记得先收藏 -- 来自一位被技术经理毒打多年的程序员的忠告

    目录

    一、效率低的原因

    1. 不需要的列会增加数据传输时间和网络开销

    2. 对于无用的大字段,如 varchar、blob、text,会增加 io 操作

    3. 失去MySQL优化器“覆盖索引”策略优化的可能性

    二、索引知识延申

    ● 联合索引 (a,b,c)

    ● 联合索引的优势

    1) 减少开销

    2)覆盖索引

    3)效率高

    ● 索引是建的越多越好吗

    三、心得体会


    一、效率低的原因

    先看一下最新《阿里java开发手册(泰山版)》中 MySQL 部分描述:

    4 - 1. 【强制】在表查询中,一律不要使用 * 作为查询的字段列表,需要哪些字段必须明确写明。

    说明:

    • 增加查询分析器解析成本。
    • 增减字段容易与 resultMap 配置不一致。
    • 无用字段增加网络 消耗,尤其是 text 类型的字段。

    开发手册中比较概括的提到了几点原因,让我们深入一些看看:

    1. 不需要的列会增加数据传输时间和网络开销

    1. 用“SELECT * ”数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。
    2. 增大网络开销;* 有时会误带上如log、IconMD5之类的无用且大文本字段,数据传输size会几何增涨。如果DB和应用程序不在同一台机器,这种开销非常明显
    3. 即使 mysql 服务器和客户端是在同一台机器上,使用的协议还是 tcp,通信也是需要额外的时间。

    2. 对于无用的大字段,如 varchar、blob、text,会增加 io 操作

    准确来说,长度超过 728 字节的时候,会先把超出的数据序列化到另外一个地方,因此读取这条记录会增加一次 io 操作。(MySQL InnoDB)

    3. 失去MySQL优化器“覆盖索引”策略优化的可能性

    SELECT * 杜绝了覆盖索引的可能性,而基于MySQL优化器的“覆盖索引”策略又是速度极快,效率极高,业界极为推荐的查询优化方式。

    例如,有一个表为t(a,b,c,d,e,f),其中,a为主键,b列有索引。

    那么,在磁盘上有两棵 B+ 树,即聚集索引和辅助索引(包括单列索引、联合索引),分别保存(a,b,c,d,e,f)和(a,b),如果查询条件中where条件可以通过b列的索引过滤掉一部分记录,查询就会先走辅助索引,如果用户只需要a列和b列的数据,直接通过辅助索引就可以知道用户查询的数据。

    如果用户使用select *,获取了不需要的数据,则首先通过辅助索引过滤数据,然后再通过聚集索引获取所有的列,这就多了一次b+树查询,速度必然会慢很多。

    d86106e5bac184ded98adf072a78e3ce.png

    由于辅助索引的数据比聚集索引少很多,很多情况下,通过辅助索引进行覆盖索引(通过索引就能获取用户需要的所有列),都不需要读磁盘,直接从内存取,而聚集索引很可能数据在磁盘(外存)中(取决于buffer pool的大小和命中率),这种情况下,一个是内存读,一个是磁盘读,速度差异就很显著了,几乎是数量级的差异。

    c3cf387a095afeed3bec5ce08b503185.png

    二、索引知识延申

    上面提到了辅助索引,在MySQL中辅助索引包括单列索引、联合索引(多列联合),单列索引就不再赘述了,这里提一下联合索引的作用

    联合索引 (a,b,c)

    联合索引 (a,b,c) 实际建立了 (a)、(a,b)、(a,b,c) 三个索引

    我们可以将组合索引想成书的一级目录、二级目录、三级目录,如index(a,b,c),相当于a是一级目录,b是一级目录下的二级目录,c是二级目录下的三级目录。要使用某一目录,必须先使用其上级目录,一级目录除外。

    如下:

    a25c8a02ab493293481d824e3129c308.png

    联合索引的优势

    1) 减少开销

    建一个联合索引 (a,b,c) ,实际相当于建了 (a)、(a,b)、(a,b,c) 三个索引。每多一个索引,都会增加写操作的开销和磁盘空间的开销。对于大量数据的表,使用联合索引会大大的减少开销!

    2)覆盖索引

    对联合索引 (a,b,c),如果有如下 sql 的,

    SELECT a,b,c from table where a='xx' and b = 'xx';
    

    那么 MySQL 可以直接通过遍历索引取得数据,而无需回表,这减少了很多的随机 io 操作。减少 io 操作,特别是随机 io 其实是 DBA 主要的优化策略。所以,在真正的实际应用中,覆盖索引是主要的提升性能的优化手段之一。

    3)效率高

    索引列多,通过联合索引筛选出的数据越少。比如有 1000W 条数据的表,有如下SQL:

    select col1,col2,col3 from table where col1=1 and col2=2 and col3=3;
    

    假设:假设每个条件可以筛选出 10% 的数据。

    • A. 如果只有单列索引,那么通过该索引能筛选出 1000W10%=100w 条数据,然后再回表从 100w 条数据中找到符合 col2=2 and col3= 3 的数据,然后再排序,再分页,以此类推(递归);
    • B. 如果是(col1,col2,col3)联合索引,通过三列索引筛选出 1000w10% 10% *10%=1w,效率提升可想而知!

    索引是建的越多越好吗

    答案自然是否定的

    • 数据量小的表不需要建立索引,建立会增加额外的索引开销
    • 不经常引用的列不要建立索引,因为不常用,即使建立了索引也没有多大意义
    • 经常频繁更新的列不要建立索引,因为肯定会影响插入或更新的效率
    • 数据重复且分布平均的字段,因此他建立索引就没有太大的效果(例如性别字段,只有男女,不适合建立索引)
    • 数据变更需要维护索引,意味着索引越多维护成本越高。
    • 更多的索引也需要更多的存储空间

    三、心得体会

    相信能看到这里这老铁要么是对MySQL有着一腔热血的,要么就是喜欢滚鼠标的。来了就是缘分,如果从本文学到了东西,请不要吝啬手中的赞哦,拒绝白嫖~

    有朋友问我,你对SQL规范那么上心,平时你写代码不会用SELECT * 吧?

    咋可能啊,天天用。。代码里也在用(一脸羞愧),其实我们的项目普遍很小,数据量也上不去,性能上还没有遇到瓶颈,所以比较放纵。

    写本篇文章主要是这个知识点网上总结的很少很散,也不规范,算是给自己也是给大家总结一份比较详细的,值得记一下的。以后给面试官说完让他没法找你茬。

    顺便吹波牛B,谢谢各位。

    3802dd257f10a16f319a8981d4327bb9.png

    来源:为什么大家都说SELECT * 效率低

    展开全文
  • 如上图,from后面的程序word_unify_dict前面有一个原点,这个原点其实就表示当前程序所在的路径的意思,也就是说当前程序同一路径的word_unify_dict这个程序中import了norm_word_dict。 这个和我们的路径用法...

    问题如上,我们在使用python导入包或者库的时候有时候会遇到包前面有一个点或者两个点的情况。
    在这里插入图片描述
    如上图,from后面的程序word_unify_dict前面有一个原点,这个原点其实就表示当前程序所在的路径的意思,也就是说当前程序是从同一路径下的word_unify_dict这个程序中import了norm_word_dict。
    这个和我们的路径用法是高度一致的。“./”表示当前路径,那么from后面的一个原点就表示当前路径,“…/”表示程序的上一级目录,那么from后面的两个原点就表示程序的上一级目录。
    比如上例中,如果我想从当前程序的父目录中的其他模块中import,做法便是在from后面加两个原点:
    在这里插入图片描述
    可以看出我是到当前程序的父目录中的for_zhl_zysz_1204文件夹下引入了train_tcm.py程序中的内容(当然文中我还没有import具体的类或者函数)。

    展开全文
  • classPath作用 不管源文件哪儿 生成的class文件都统一的存储配置的目录下不配置这个变量时,通常我们写的java文件编译之后Java文件和字节码文件都处在同一份文件夹中。当我们选定一个路径放入classPath...

    path作用 让工具可以在任何的位置都可以用,即在配置环境变量时,将JDK中bin文件夹下的路径写入到Path,使无论在电脑中任何一个地方的写的java程序都可以被javac.exe程序编译成为字节码文件。
    classPath作用 不管源文件在哪儿 生成的class文件都统一的存储在配置的目录下。在不配置这个变量时,通常我们写的java文件在编译之后Java文件和字节码文件都是处在同一份文件夹中。当我们选定一个路径放入classPath变量下时,我们编译的Java源码所生成的字节码文件都将放置在我们所选的路径中。
    JAVA_HOME 目的是为了让路径的写法变得简单(相对路径的写法)
    例如:
    JAVA_HOME C://program files/java/jdk
    path %JAVA_HOME%/bin

    展开全文
  • 默认情况,存储全局目录中的对象属性那些经常用到的内容,而非全部属性。 - g' B e* Q1 b' N! @ 4 k9 H# a7 L4 C" C全局目录服务器一个域控制器,活动目录建立的第一个域控制器自动成为全局目录服务器。全局...
  • 配置视图解析器简化视图名称 ... (prefix前缀的意思=从什么目录下开始扫描视图) (suffix后缀的意思) 这个配置文件配置在spring mvc的配置文件中! redirect(容器外,不在同一
    配置视图解析器简化视图名称




    视图,简单说就是JSP文件!


    视图解析器的作用:通过视图名称,找到视图!




    视图解析器有很多,常用的只有以下这种


    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value= ""/> (prefix是前缀的意思=从什么目录下开始扫描视图)
    <property name="suffix" value= ".jsp"/>(suffix是后缀的意思)

    </bean>

    这个配置文件配置在spring mvc的配置文件中!



    redirect(容器外,不在同一次的请求中)跳转的方式,视图解析器不起作用。
    展开全文
  • 遇到这样的错,想必每...因为在同一文件存在工程的不同的目录下,反复添加到工程里。造成重定义,解决办法删除里重复的refrence就可以了。 原来这个项目之前就有这个库,这个错误意思是你之前就已经定义过这个属性
  • Pytorch实现自编码器

    千次阅读 2020-02-26 09:08:22
    原文地址 分类目录——Pytorch 什么是编码器 ...但是高清的无论是在保存,还是提取上都会更费工夫。深度学习处理起来亦如此,深度学习会包含很多层,每层节点也很多,这种情况,如果输入数据的规...
  • 聚类的意思顾名思义,按照一定的法则,将部分“相近的”数据聚成同一类,给它们相同的标签即可。   下面介绍几种比较有代表性的聚类方法。 二.基于GMM的聚类   半监督学习中我们已经讲过部分数据有标签的...
  • // 如果entry不为空,并不在同一目录下 File file = new File("F:\\" + entry.getName()); // 获取文件目录 System.out.println(file); if (!file.exists()) { // 如果该文件不存在 file....
  • 你必须知道的495个C语言问题

    千次下载 热门讨论 2015-05-08 11:09:25
    1.11 extern函数声明中是什么意思? 1.12 关键字auto到底有什么用途? 类型定义(typedef) 1.13 对于用户定义类型,typedef和#define有什么区别? 1.14 我似乎不能成功定义一个链表。我试过typedefstruct{...
  • 并且要保证字幕名字与视频名字相同,且文件在同一目录下。个人更推荐klite mega codec packQ:为什么字幕在播放时比较卡? A:有多方面的原因,有可能因为解码器比较老旧(请更新解码包),也可能播放器的问题...
  • PowerShadow(影子系统)

    2008-10-25 07:53:32
    虽然笔者想不到记录网址有什么好处, 不过这技巧或者某种情况下是有用途的. 如果不是使用Shadow Mode, 平时我们亦可以流览完网页后, 一次过将IE的网页址记录清除(这个我觉得只是为求方便)  很多人都会电脑中...
  • arcgis工具

    2012-10-22 22:37:31
    可以使用多种方法,查找在同一图层中或不同图层间相互邻近或叠置的点、线、多边形等要素。 被…跨越边界(Are crossed by the outline of) 利用这种方法,选择被另一图层要素覆盖的某个图层上的要素。例如,...
  • o 2.4 extern 函数声明中是什么意思? o 2.5 关键字 auto 到底有什么用途? o 2.6 我似乎不能成功定义一个链表。我试过 typedef struct { char *item; NODEPTR next; } *NODEPTR; 但是编译器报了错误信息。难道...
  • 1.11 extern函数声明中是什么意思? 6 1.12 关键字auto到底有什么用途? 7 类型定义(typedef) 7 1.13 对于用户定义类型,typedef 和#define有什么区别? 7 1.14 我似乎不能成功定义一个链表。我试过...
  • 《你必须知道的495个C语言问题》

    热门讨论 2010-03-20 16:41:18
    1.11 extern函数声明中是什么意思? 6 1.12 关键字auto到底有什么用途? 7 类型定义(typedef) 7 1.13 对于用户定义类型,typedef 和#define有什么区别? 7 1.14 我似乎不能成功定义一个链表。我试过...
  • x-scan-v3.3-cn

    2013-09-23 21:36:56
    多线程扫描这个扫描器的一大特色,所谓多线程就是说同时在本地系统开辟多个socket连接,在同一时间内扫描多个服务器,这样做的好处提高了扫描速度,节省时间,根据系统的资源配置高低,线程数字也可以自行设定...
  • JAVA面试题最全集

    2010-03-13 13:09:10
    87.UNIX中QT是什么意思? 88.软件开发生命周期中的哪个阶段开始测试? 89.dotnet与J2EE的比较? 90.什么是ActiveX? 91.Java中IDL是什么? 92.ISO9000和CMM是什么?IS09000和CMM(软件能力成熟度模型)认证是国际上...
  • 报组是什么意思? 6. 组和中心有什么区别? 7. 如何获知每个组的招生人数? 8. 本科学校不好,报考北邮会不会有歧视? 9. 北邮考研看重比赛和项目经历吗? 10. 跨考北邮计算机应该准备些什么,会不会歧视跨考? 11. ...
  • Teahouse WordPress主题

    2014-07-16 19:51:59
    主题的名字叫:Teahouse,中文意思是茶馆,当初命名的原因为了给人一种怀旧情怀,主题适合做个人博客,重点写作和阅读。 基本功能包括。Html5+Css3、相应式设计、Retina设计、内置FontAwesome字体图标、内置...
  • java-servlet-api.doc

    2009-10-13 19:34:17
    例如,一个Servlet环境属于bank应用的,它将被映射到/bank目录下这种情况下,一个对getContext方法的调用会返回/bank的Servlet环境。 HTTP会话 HTTP一个没有状态的协议。要建立一个有效的Web服务应用,你...
  • java 面试题 总结

    2009-09-16 08:45:34
    24、GC是什么? 为什么要有GC?  GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象...
  • 27、GC是什么? 为什么要有GC?  GC是垃圾收集的意思(Gabage Collection),内存处理是编程人员容易出现问题的地方,忘记或者错误的内存回收会导致程序或系统的不稳定甚至崩溃,Java提供的GC功能可以自动监测对象...
  • 然后单击“网络 ID”按钮,开始“网络标识向导”:单击“一步”,选择“本机商业网络的一部分,用它连接到其他工作着的计算机”;单击“一步”,选择“公司使用没有域的网络”;单击“一步”按钮,然后输入...
  • 二十三种设计模式【PDF版】

    热门讨论 2011-05-30 14:13:49
    如果你还不了解设计模式是什么的话? 那就先看设计模式引言 ! 学习 GoF 设计模式的重要性 建筑和软件中模式之异同 A. 创建模式 设计模式之 Singleton(单态/单件) 阎宏博士讲解:单例(Singleton)模式 保证...
  • 会计理论考试题

    2012-03-07 21:04:40
    9.___B___Windows管理文件的特征,与MS-DOS的目录类似。 A、快捷键 B、文件夹 C、任务条 D、开始菜单 10.CAI指__C___。 A、计算机辅助设计 B、计算机辅助制造 C、计算机辅助教学 D、计算机辅助管理 11.资源...

空空如也

空空如也

1 2
收藏数 39
精华内容 15
关键字:

在同一目录下是什么意思