select * 效率低的原因

使用SELECT*可能导致服务器解析性能下降、增加IO读写消耗和网络传输成本。此外,它可能阻碍索引的利用,影响查询效率。对于索引,文章指出聚集索引存储所有行信息,而辅助索引存储列信息。并非所有列都适合创建索引,尤其是数据量小、不常用或频繁修改的列。

首先这是一条SQL查询语句,sql语句都是从客户端发给服务端的,select * 就会引发一些问题

1.解析sql性能慢,增加的服务器解析sql的成本

2.增加了IO读写的消耗,包括了不用的数据,甚至是大文本数据,用*作为条件会查询出大量不需要的数据

3.增加了网络传输的损耗

4.真正使用Java操作数据的时候,使用的resultset,resultsetmatadate不一致

5.如果使用*会屏蔽索引的使用,借助不到索引,性能自然也就会慢

 索引

聚集索引:记录表格全部行信息,每个表中只有一个

辅助索引:存储的是列信息-----引用

索引并不是越多越好的,表格中数据量较小,列不经常被利用当作条件,列经常用(频繁的修改)的时候不建议创建索引,索引本身是有空间和存储消耗的

SQL查询中,使用`SELECT *`和明确指定字段(如`SELECT column1, column2`)之间的效率差异是一个常见的性能优化问题。虽然在某些情况下它们的执行计划可能相同,但通常来说,选择具体字段可以带来更好的性能表现。 ### 查询效率差异的原因 1. **数据传输量** 当使用`SELECT *`时,数据库会返回表中的所有列,而不仅仅是用户需要的数据。这意味着更多的数据需要从磁盘读取、通过网络传输到客户端,并占用更多的内存资源[^4]。相比之下,指定字段可以减少不必要的数据传输,提高查询响应速度。 2. **索引利用情况** 如果查询只需要某些列,并且这些列已经被一个覆盖索引来包含,则数据库可以直接从索引中获取数据,而不必访问实际的数据行(即所谓的“覆盖索引”)。这种情况下的性能提升非常显著。然而,如果使用`SELECT *`,则很可能无法利用覆盖索引,因为查询涉及了所有列,而这些列不一定全部包含在一个索引中[^2]。 3. **锁定与并发控制** `SELECT *`可能会导致更长的锁持有时间,因为它涉及更多数据页或行的访问。这会影响并发性能,尤其是在高并发环境下。 4. **维护开销** 在设计视图或存储过程中使用`SELECT *`可能导致未来表结构变更时出现意外行为。例如,新增一列后,原本只期望得到几列的应用程序现在会接收到额外的数据,这可能引发逻辑错误或者需要额外处理[^1]。 5. **统计信息与执行计划稳定性** 明确列出所需字段有助于优化器生成更加稳定和准确的执行计划。此外,在某些数据库系统中,对于特定列的统计信息更新频率更高,这也影响着查询优化器的选择。 ### 实际测试案例 为了验证上述理论,可以通过对比两种方式在相同环境下的执行时间来观察差异。以下是一个简单的Spark SQL示例,展示如何进行这样的比较: ```python # 使用 SELECT * start_time = time.time() spark.sql("SELECT * FROM src WHERE key < 10").collect() end_time = time.time() print(f"SELECT * took {end_time - start_time} seconds") # 使用指定字段 start_time = time.time() spark.sql("SELECT key, value FROM src WHERE key < 10").collect() end_time = time.time() print(f"SELECT specific columns took {end_time - start_time} seconds") ``` 此代码片段展示了如何测量两种不同查询语句的执行时间。实际结果将取决于具体的数据库配置、表大小以及硬件性能等因素。 ### 结论 尽管`SELECT *`提供了便利性,但在生产环境中推荐始终明确列出所需的字段。这样做不仅可以提高查询性能,还能增强应用程序的可维护性和健壮性。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值