首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

SELECT * 效率低到底有哪几种因素?

失去MySQL优化器“覆盖索引”策略优化的可能性 二、索引知识延申 联合索引 (a,b,c) 联合索引的优势 索引是建的越多越好吗 三、心得体会 ---- 面试官:“小陈,说一下你常用的SQL优化方式吧...如果DB和应用程序不在同一台机器,这种开销非常明显 即使 mysql 服务器和客户端是同一台机器,使用的协议还是 tcp,通信也是需要额外的时间。 2....那么,磁盘上有两棵 B+ 树,即聚集索引和辅助索引(包括单列索引、联合索引),分别保存(a,b,c,d,e,f)和(a,b),如果查询条件where条件可以通过b的索引过滤掉一部分记录,查询就会先走辅助索引...二、索引知识延申 上面提到了辅助索引,MySQL中辅助索引包括单列索引、联合索引(多联合),单列索引就不再赘述了,这里提一下联合索引的作用 联合索引 (a,b,c) 联合索引 (a,b,c) 实际建立了...比如有 1000W 条数据的表,有如下SQL: select col1,col2,col3 from table where col1=1 and col2=2 and col3=3; 假设:假设每个条件可以筛选出

39730

为什么大家都说 SELECT * 效率低?

如果DB和应用程序不在同一台机器,这种开销非常明显即使 mysql 服务器和客户端是同一台机器,使用的协议还是 tcp,通信也是需要额外的时间。2....那么,磁盘上有两棵 B+ 树,即聚集索引和辅助索引(包括单列索引、联合索引),分别保存(a,b,c,d,e,f)和(a,b),如果查询条件where条件可以通过b的索引过滤掉一部分记录,查询就会先走辅助索引...索引知识延申上面提到了辅助索引,MySQL中辅助索引包括单列索引、联合索引(多联合),单列索引就不再赘述了,这里提一下联合索引的作用。...比如有 1000W 条数据的表,有如下SQL:select col1,col2,col3 from table where col1=1 and col2=2 and col3=3;复制代码假设:假设每个条件可以筛选出...4)索引是建的越多越好吗答案自然是否定的数据量小的表不需要建立索引,建立会增加额外的索引开销不经常引用的不要建立索引,因为不常用,即使建立了索引也没有多大意义经常频繁更新的不要建立索引,因为肯定会影响插入或更新的效率数据重复且分布平均的字段

49320
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Mysql进阶-3】大量实例悟透EXPLAIN与慢查询

    WHERE条件是索引前导,但查询至少有一个未与条件同一个索引树上,必须通过回表查询 Using where WHERE条件列上无索引(既没有单独索引,也没有联合索引),而与查询无关 Using...7、index 这种情况意味着查询语句对一个索引树进行了全量扫描,出现这种情况是因为: 查询同一个索引树上,但没有查询条件 查询同一个索引树上,但WHERE条件是索引的非前导,导致不能直接在索引中定位...条件WHERE条件列上创建有索引,且是索引前导 查询要与条件同一棵索引树上,有3种情况:一是查询即是条件本身,二是查询条件建立了联合索引,三是查询是被聚集索引覆盖的。...条件WHERE条件不是索引前导,查询条件同一个索引树上(查询是主键或查询条件建有联合索引) WHERE条件是索引前导但使用范围查询时,且查询条件同一个索引树上 示例:...4、NULL 释义: 这种情况意味着WHERE条件是索引前导,但查询至少有一个未与条件同一个索引树上,必须通过回表查询。

    1.3K30

    Java面经——数据库

    通过对Keys进行求hash散值对应到相应的bucket位置,然后再将bucket的数据全部加载到内存中,bucket中进行线性查询目标数据位置。理论查询效率比B树和B+树效率都高。...可重复读(Repeatable reads),保证同一个事务中多次读取的数据是一致的,这是 MySQL InnoDB 引擎的默认隔离级别,但是和一些其他数据库实现不同的是,可以简单认为 MySQL 可重复读级别不会出现幻象读...所谓第一范式(1NF)是指数据库表的每一都是不可分割的基本数据项,同一中不能有多个值,即实体中的某个属性不能有多个值或者不能有重复的属性。...应尽量避免 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以num设置默认值...0,确保表中num没有null值,然后这样查询: select id from t where num=0 很多时候用 exists 代替 in 是一个好的选择Where子句替换HAVING 子句

    1.3K60

    索引策略,性能爆炸!!!

    前言 一篇说了MySQL有哪几种索引类型,今天就来记录一下具体的索引策略。 相信大家面试时候也会遇到如何进行查询优化的问题,其中索引相关的策略就是重点考察项,比如怎么设置索引等。...索引合并策略有时候是一种优化的结果,但实际更多时候说明表的索引建的很糟糕: 1、当出现对多个索引做相交操作时候(AND),意味着需要一个包含所有相关的多索引,而不是多个独立的单列索引。...经验法则: 将选择性最高的放在索引最前列 聚簇索引 聚簇索引并不是一种单独的索引类型,而是一种数据存储方式,InnoDB的聚簇索引实际同一个结构中保存了B-Tree索引和数据行。...如果索引不能覆盖查询所需的全部,那就不得不没扫描一条索引记录就回表查询一次对应的行。这基本都是随机IO。 MySQL可以使用同一个索引既满足排序、又满足查找行。...不管是范围条件查询还是In条件查询,EXPLAIN的type都是range,对于范围条件查询,MySQL无法再使用范围后面的其他索引列了,但是IN查询则没有这个限制。

    99420

    为什么大家都说“SELECT *”效率低?

    如果 DB 和应用程序不在同一台机器,这种开销非常明显 即使 MySQL 服务器和客户端是同一台机器,使用的协议还是 TCP,通信也是需要额外的时间。...如果查询条件where 条件可以通过 b 的索引过滤掉一部分记录,查询就会先走辅助索引;如果用户只需要 a 和 b 的数据,直接通过辅助索引就可以知道用户查询的数据。...索引知识延申 上面提到了辅助索引, MySQL 中辅助索引包括单列索引、联合索引(多联合),单列索引就不再赘述了,这里提一下联合索引的作用。...比如有 1000W 条数据的表,有如下 SQL: select col1,col2,col3 from table where col1=1 and col2=2 and col3=3; 假设:假设每个条件可以筛选出...B:如果是(col1,col2,col3)联合索引,通过三索引筛选出 1000W10% 10% *10%=1W,效率提升可想而知! 索引是建的越多越好吗

    41710

    mysql索引的类型和优缺点

    注意,如果某个数据包含许多重复的内容,为它建立索引就没有太大的实际效果。 从理论讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL同一个数据表里的索引总数限制为16个。 1....类似地,如果WHERE子句的查询条件里使用了函数(WHERE DAY(column) = …),MySQL也将无法使用索引。...如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,MySQL只有搜索模板的第一个字符不是通配符的情况下才能使用索引。...因此,应该只为那些最经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据创建索引。...复合索引 索引可以覆盖多个数据,如像INDEX(columnA, columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。

    2.3K70

    mysql索引的类型和优缺点

    注意,如果某个数据包含许多重复的内容,为它建立索引就没有太大的实际效果。 从理论讲,完全可以为数据表里的每个字段分别建一个索引,但MySQL同一个数据表里的索引总数限制为16个。 1....类似地,如果WHERE子句的查询条件里使用了函数(WHERE DAY(column) = …),MySQL也将无法使用索引。...如果WHERE子句的查询条件里使用比较操作符LIKE和REGEXP,MySQL只有搜索模板的第一个字符不是通配符的情况下才能使用索引。...因此,应该只为那些最经常出现在查询条件(WHERE column = …)或排序条件(ORDER BY column)中的数据创建索引。...复合索引 索引可以覆盖多个数据,如像INDEX(columnA, columnB)索引。这种索引的特点是MySQL可以有选择地使用一个这样的索引。

    1.1K30

    PawSQL审核 | SQL审核引擎的设计目标

    审查规则越多越好吗?市场上到底需要什么样的SQL审核引擎?看一下SQL优化领域的领先厂商PawSQL如何设计它的SQL审核引擎。...1.1 抽象化 想要审核规则尽量少,但是覆盖度却尽量广,就需要对审核规则的模式进行抽象化,这样才能用同一个规则覆盖不同的数据库类型的SQL,不同的SQL写法。...譬如对于`表连接缺少链接条件`这个审查规则,它既包括通过`JOIN`操作符显式的表连接(案例1),也包括FROM多张表,但是`WHERE`里缺少连接条件的情况(案例2);同时它也适用于MySQL/PostgreSQL...譬如当禁止`删除的规则`被启用时,其项下的两个规则`删除的列名需满足指定规范`和`禁止删除索引中的`就不会参与审核了;从而提升了审核的效率,同时避免了无效告警的干扰。...PawSQL的审核规则体系基本做到了除DCL和TCL之外所有类型的全覆盖: 目标3. 确保尽量高的审核正确率 我们从漏报率和误报率两个维度衡量审核的正确率。

    9310

    为什么大家都说 SELECT * 效率低?

    如果DB和应用程序不在同一台机器,这种开销非常明显 即使 mysql 服务器和客户端是同一台机器,使用的协议还是 tcp,通信也是需要额外的时间。 2....那么,磁盘上有两棵 B+ 树,即聚集索引和辅助索引(包括单列索引、联合索引),分别保存(a,b,c,d,e,f)和(a,b),如果查询条件where条件可以通过b的索引过滤掉一部分记录,查询就会先走辅助索引...二、索引知识延申 上面提到了辅助索引,MySQL中辅助索引包括单列索引、联合索引(多联合),单列索引就不再赘述了,这里提一下联合索引的作用。...比如有 1000W 条数据的表,有如下SQL: select col1,col2,col3 from table where col1=1 and col2=2 and col3=3; 假设:假设每个条件可以筛选出...索引是建的越多越好吗 答案自然是否定的 数据量小的表不需要建立索引,建立会增加额外的索引开销 不经常引用的不要建立索引,因为不常用,即使建立了索引也没有多大意义 经常频繁更新的不要建立索引,因为肯定会影响插入或更新的效率

    39221

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

    如果DB和应用程序不在同一台机器,这种开销非常明显 即使 mysql 服务器和客户端是同一台机器,使用的协议还是 tcp,通信也是需要额外的时间。 2....那么,磁盘上有两棵 B+ 树,即聚集索引和辅助索引(包括单列索引、联合索引),分别保存(a,b,c,d,e,f)和(a,b),如果查询条件where条件可以通过b的索引过滤掉一部分记录,查询就会先走辅助索引...二、索引知识延申 上面提到了辅助索引,MySQL中辅助索引包括单列索引、联合索引(多联合),单列索引就不再赘述了,这里提一下联合索引的作用 联合索引 (a,b,c) 联合索引 (a,b,c) 实际建立了...比如有 1000W 条数据的表,有如下SQL: select col1,col2,col3 from table where col1=1 and col2=2 and col3=3; 假设:假设每个条件可以筛选出...索引是建的越多越好吗 答案自然是否定的 数据量小的表不需要建立索引,建立会增加额外的索引开销 不经常引用的不要建立索引,因为不常用,即使建立了索引也没有多大意义 经常频繁更新的不要建立索引,因为肯定会影响插入或更新的效率

    46050

    MySQL性能优化(四):如何高效正确的使用索引

    因为MySQL是不允许索引这些的完整长度的。 三、多索引 多索引,是指为每个创立独立的索引。 SQL优化时,有人会采取“把where条件里面的都建索引”,希望能够对查询性能有所优化。...多个列上建立独立的单列索引,大部分情况下并不能提高MySQL的查询性能。这也是将其错误的做法。 MySQL5.0及之后版本引入了索引合并策略,一定程度上可以使用表多个单列索引来定位指定的行。...索引合并策略有时候是一种优化的结果,但实际更多时候说明了表的索引建的很糟糕: 1)当出现对多个索引做相交操作时(通常由多个AND条件),通常意味着需要一个包含所有相关的多索引,而不是多个独立的单列索引...2)当需要对多个索引做联合操作室(通常有多个OR条件),通常需要耗费大量的CPU和内存资源算法的缓存、排序和合并操作。特别是当其中有些索引的选择性不高,需要合并扫描返回的大量数据的时候。...然而唯一限制和主键限制都是通过索引使用,因此,上面的写法实际相同的列上创建了三个重复的索引。通常并没有理由要这样做,除非是同一创建不同类型的索引来满足不同的查询需求。

    2.1K20

    除了增删改查你对MySQL还了解多少?

    我们知道MySQL登录的命令可以携带多个参数,我们有权限远程登录的情况下,通过-P和-h来指定端口和域名; 我们都知道MySQL服务器的默认端口为3306,之后就在这个端口号上等待客户端进程进行连接...; 多种情况说明如下: 索引参与计算 如果where条件中age中使用了计算,则不会使用该索引。...ORDER BY操作中,排序的同时也WHERE中时,MYSQL将无法使用索引; MySQL索引通常是被用于提高WHERE条件的数据行匹配或者执行联结操作时匹配其它表的数据行的搜索速度。...如果要对多个字段使用索引,建立复合索引。 2>ORDER BY操作中,MySQL只有排序条件不是一个查询条件表达式的情况下才使用索引。...可以见到这种思路是有局限性的,首先必须要有自增索引,而且数据逻辑必须是连续的,其次,你还必须知道特征值。 如此苛刻的要求,实际应用中是不可能满足的。

    73430

    为什么大家都说“SELECT *”效率低?

    如果 DB 和应用程序不在同一台机器,这种开销非常明显 即使 MySQL 服务器和客户端是同一台机器,使用的协议还是 TCP,通信也是需要额外的时间。...如果查询条件where 条件可以通过 b 的索引过滤掉一部分记录,查询就会先走辅助索引;如果用户只需要 a 和 b 的数据,直接通过辅助索引就可以知道用户查询的数据。...索引知识延申 上面提到了辅助索引, MySQL 中辅助索引包括单列索引、联合索引(多联合),单列索引就不再赘述了,这里提一下联合索引的作用。...比如有 1000W 条数据的表,有如下 SQL: select col1,col2,col3 from table where col1=1 and col2=2 and col3=3; 假设:假设每个条件可以筛选出...B:如果是(col1,col2,col3)联合索引,通过三索引筛选出 1000W10% 10% *10%=1W,效率提升可想而知! 索引是建的越多越好吗

    1.9K10

    Mysql优化-索引

    单一索引是指索引列为一的情况,即新建索引的语句只实施; 用户可以多个列上建立索引,这种索引叫做复合索引(组合索引); 禁用缓存 因为我们要测试添加索引的效果,所以就先禁用缓存,防止影响测试结果...表的主键、外键必须有索引; 数据量超过300的表应该有索引; 经常与其他表进行连接的表,连接字段应该建立索引; 经常出现在Where子句中的字段,特别是大表的字段,应该建立索引; 索引应该建在较高选择性的字段...IN能使用到索引,但是当表内存在多个单列索引时,MySQL不会自动选择in条件使用的索引,即使它是最优索引。...MATCH (docHtml) AGAINST ('+关于静摩擦力*' IN BOOLEAN MODE) limit 0,10; MATCH() 函数的所有参数必须是从来自于同一张表的,同时必须是同一个...order by满足两种情况会使用index排序: ①、order by语句使用索引最左前列, ②、使用where子句与order by子句条件组合满足索引最左前列 双路排序:MySQL4.1之前,两次扫描磁盘

    1.3K50

    千万级MySQL数据库建立索引,提高性能的秘诀

    表的垂直拆分 把含有多个的表拆分成多个表,解决表宽度问题,具体包括以下几种拆分手段: 把不常用的字段单独放在同一个表中; 把大字段独立放入一个表中; 把经常使用的字段放在一起; 这样做的好处是非常明显的...需要把数据存放到多个数据库中,提高系统的总体可用性(分库,鸡蛋不能放在同一个篮子里)。...若多个物理记录对应同一个索引,若同时访问,也会出现锁冲突; 当表有多个索引时,不同事务可以用不同的索引锁住不同的行,另外innodb会同时用行锁对数据记录(聚簇索引)加锁。...而死锁发生在当多个进程访问同一数据库时,其中每个进程拥有的锁都是其他进程所需的,由此造成每个进程都无法继续下去。...,确保表中num没有null值,然后这样查询:select id from t where num=0 应尽量避免 where 子句中使用!

    3.7K10

    SQL优化

    索引合并简单来说就是把多条件查询,比如or或and查询对多个索引分别进行条件扫描,然后将它们各自的结果进行合并,因此就不会导致索引失效的问题了 如果从Explain执行计划的type的值是index_merge...可以看出MySQL使用索引合并的方式来执行对表的查询 避免 where 查询条件中使用 !...另一个优化点,就是连接时用小结果集驱动大结果集,索引优化的基础能进一步减少嵌套循环的次数 如果难以判断哪个是大表,哪个是小表,可以用inner join连接,MySQL会自动选择小表去驱动大表 避免使用...JOIN关联太多的表 对于 MySQL 来说,是存在关联缓存的,缓存的大小可以由join_buffer_size参数进行设置 MySQL 中,对于同一个 SQL 多关联(join)一个表,就会多分配一个关联缓存...保证网络带宽的通畅(低延迟)以及够大的网络带宽是 MySQL 正常运行的基本条件,如果条件允许的话也可以设置多个网卡,以提高网络高峰期 MySQL 服务器的运行效率 内存 MySQL 服务器的内存越大,

    74330

    【建议收藏】MySQL 三万字精华总结 —锁机制和性能调优(四)

    死锁 死锁产生: 死锁是指两个或多个事务同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环 当事务试图以不同的顺序锁定资源时,就可能产生死锁。...高并发系统,当许多线程等待同一个锁时,死锁检测可能导致速度变慢。...InnoDB避免死锁: 为了单个InnoDB表执行多个并发写入操作时避免死锁,可以事务开始时通过为预期要修改的每个元祖(行)使用SELECT ......本质也是一种索引访问,他返回所有匹配某个单独值的行,然而,它可能也会找到多个符合条件的行,多以他应该属于查找和扫描的混合体 range:只检索给定范围的行,使用一个索引来选择行。...选择组合索引的时候,尽量选择可以能够包含当前query中的where字句中更多字段的索引 尽可能通过分析统计信息和调整query的写法来达到选择合适索引的目的 少用Hint强制索引 查询优化 永远小标驱动大表

    92510

    这个MySQL优化原理剖析,比照X光还清楚

    6. key key显示MySQL实际决定使用的键(索引) 如果没有选择索引,键是NULL。...Extra 该包含MySQL解决查询的详细信息,有以下几种情况: Using index:这发生在对表的请求都是同一索引的部分的时候,返回的数据只使用了索引中的信息,而没有再去访问表中的行记录,是性能高的表现...Using where数据是从仅仅使用了索引中的信息而没有读取实际的行动的表返回的,这发生在对表的全部的请求都是同一个索引的部分的时候,表示mysql服务器将在存储引擎检索行后再进行过滤。...Impossible where:这个值强调了where语句会导致没有符合条件的行。...可以发现,执行这条SQL语句实际没有走index_title索引,而是选择走index_author_id索引。

    68740
    领券