避免 SELECT * 查询:指定字段,提升查询效率
前言几乎所有新手写查询都会用SELECT *看似方便实则带来大量性能损耗IO 增加、回表频繁、内存占用高、网络传输量大。本文讲解SELECT *的危害、优化写法、实战对比。一、SELECT * 三大性能危害1. 增加磁盘 IO读取无用字段数据表可能包含大文本、长字符串、冗余字段备注、富文本、日志SELECT *会全部读取磁盘 IO 成倍增加。2. 破坏覆盖索引触发回表查询覆盖索引Using index只需要索引字段即可返回数据无需访问主键、回表一旦使用SELECT *需要整行数据必须回表性能大幅下降。3. 增大网络传输与内存开销查询返回数据体积变大数据库与应用之间网络传输耗时增加服务端接收数据占用更多堆内存高并发下易 GC、内存溢出。4. 业务隐患表新增字段后代码兼容问题后期新增字段SELECT *会自动返回新字段若实体类未同步会出现映射异常、多余字段序列化。二、优化前后对比低效写法禁止-- 查询用户列表只需要姓名、手机号却读取全部字段 SELECT * FROM user WHERE status 1 LIMIT 10;高效规范写法推荐-- 只查询业务需要的字段 SELECT id, username, phone FROM user WHERE status 1 LIMIT 10;三、覆盖索引实战示例建复合索引idx_status_phone(status,username,phone)-- 仅查询索引内字段触发Using index无需回表 SELECT username, phone FROM user WHERE status 1; -- SELECT * 需要读取完整行必须回表性能差 SELECT * FROM user WHERE status 1;四、开发规范所有业务查询禁止SELECT *显式列出所需字段列表、分页、统计仅展示必要字段屏蔽大文本、超长备注若需全部字段也要逐一写出字段名便于后期维护多表 JOIN 查询分别指定每张表字段避免u.*,o.*。五、特殊场景折中方案导出完整报表、数据备份场景可临时使用SELECT *日常业务接口严格禁用。