SELECT * 效率低的原因是什么?
一、SELECT * 效率低的原因
1. 不需要的列会增加数据传输时间和网络开销
用“SELECT * ”数据库需要解析更多的对象、字段、权限、属性等相关内容,在 SQL 语句复杂,硬解析较多的情况下,会对数据库造成沉重的负担。增大网络开销;* 有时会误带上如log、IconMD5之类的无用且大文本字段,数据传输size会几何增涨。如果DB和应用程序不在同一台机器,这种开销非常明显即使 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+树查询,速度必然会慢很多。
延伸阅读:
二、联合索引 (a,b,c)
联合索引 (a,b,c) 实际建立了 (a)、(a,b)、(a,b,c) 三个索引。
我们可以将组合索引想成书的一级目录、二级目录、三级目录,如index(a,b,c),相当于a是一级目录,b是一级目录下的二级目录,c是二级目录下的三级目录。要使用某一目录,必须先使用其上级目录,一级目录除外。
联合索引的优势
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,效率提升可想而知。
猜你喜欢LIKE
相关推荐HOT
更多>>
Vertica数据库为什么插入数据那么快?
一、Vertica数据库插入数据快的原因1、列式存储结构Vertica是一种列式数据库,它将数据按列存储在磁盘上,而不是按行存储。这种存储方式使得插...详情>>
2023-10-15 23:29:03
MyBatis的优势是什么?
一、MyBatis的优势1、灵活性MyBatis 的配置文件提供了很大的灵活性,可以根据具体需求进行细粒度的配置。你可以定义 SQL 查询语句、参数映射、...详情>>
2023-10-15 23:05:44
怎么打开一个.bak格式的30G的数据库文件?
一、打开一个.bak格式的30G的数据库文件的步骤1、打开SQL Server Management Studio首先打开SQL Server Management Studio,SQL Server详情>>
2023-10-15 21:49:54
PLSQL与win10不兼容怎么解决?
一、PLSQL与win10不兼容怎么解决如果你仅仅是要用(T)SQL语句的话,不一定要用PL/SQL,可以建议用idea的Datagrip或是任意ultimate版。IJ/PC/PS(...详情>>
2023-10-15 21:12:44热门推荐
从Oracle到GaussDB的数据迁移实操要怎么避坑?
沸Vertica数据库为什么插入数据那么快?
热MyBatis的优势是什么?
热互联网、金融这两个领域上用于数据挖掘、数据分析的数据库是什么?
新什么是四层(L4 proxy)和七层负载均衡(L7 proxy)?
怎么打开一个.bak格式的30G的数据库文件?
PLSQL与win10不兼容怎么解决?
事务并发控制s2pl和s2pl有何区别?
为什么做java的web开发会使用struts2,springMVC和spring框架?
数据库存储时间为什么用的是utcnow而不是now?
java中怎么把jdbc查询的resultset对象转为json?
为什么用navicat连接sqlserver后看不到master数据库?
Plugin解决了什么问题?
Android怎么连接远程数据库?
技术干货






