MySQL中使用SELECT *是否存在效率低、指代不明确的问题?
关于MySQL
SELECT * 用法的问题解答 你对SELECT *的理解是正确的,它仅返回FROM关键字后指定的单张/多张关联表的所有列,不会跨schema抓取其他无关表的数据。以下是对你的几个疑问的对应说明:
- 效率问题确实存在:如果表中包含你实际不需要的大字段(如TEXT、BLOB、长VARCHAR类型),
SELECT *会强制读取并返回这些内容,大幅提升数据传输、内存占用的开销。即便没有大字段,多余列的返回也会让覆盖索引失效,本来可以直接从索引中取数完成的查询,必须回表读取完整行数据,查询性能会出现数倍甚至数十倍的下降,数据库体量越大,这类额外开销的影响越明显。 - 指代模糊的问题同样存在:多表关联查询时,如果多张表存在同名字段(如
id、create_time等通用字段),SELECT *返回的结果会出现重复列名,不仅容易导致后续业务代码取值出错,还会提升排查问题的成本。如果后续表结构发生变更(新增、删除列),使用SELECT *的查询不会提前抛出语法错误,很容易引发隐蔽的业务逻辑bug。 - 绝大多数场景下都建议明确指定查询列:除非你确实需要用到目标表的全部字段,否则都建议显式写出需要的列名,关联查询时还可以给表设置别名,列名前统一加上别名前缀,进一步提升语句的可读性和可维护性。你给出的示例中如果仅需要用到
order_id、unit_price、quantity三个字段,可以改写为如下写法,性能和可维护性都更好:
SELECT order_id, unit_price, quantity FROM order_items WHERE order_id = 6 AND unit_price*quantity > 30
内容的提问来源于stack exchange,提问作者user11838329
相关产品推荐
相关产品推荐

