 :90% 程序员都写错的 SQL!SELECT 1/COUNT (*) 用错性能差 10 倍,看完少踩坑)
日常写 SQL 时你是不是也把SELECT 1、SELECT *、COUNT(1)、COUNT(*)混着用看似就差几个字符实则执行逻辑、性能天差地别 —— 用错不仅拖慢系统甚至可能让数据库直接卡崩今天纯实战干货把这几个写法的区别、用法、坑点讲透新手也能秒懂!先建测试表直接复制就能测sqlCREATE TABLE user ( id INT PRIMARY KEY, name VARCHAR(50), age INT ); INSERT INTO user VALUES (1, Alice, 25), (2, Bob, NULL), (3, NULL, 30), (4, NULL, NULL);核心区别4 种写法一测就懂1. SELECT 1 FROM user → 只认 “行”不认 “数据”sqlSELECT 1 FROM user;✅ 结果4 行全是 1哪怕字段全是 NULL也照样返回 1plaintext1 1 1 1 关键它不管表里存了啥只告诉你 “有多少行”不读取任何真实字段。2. SELECT * FROM user → 把所有数据 “扒光”sqlSELECT * FROM user;结果所有列原样返回NULL 也不会藏起来plaintextid | name | age 1 | Alice | 25 2 | Bob | NULL 3 | NULL | 30 4 | NULL | NULL 关键读取全量列数据IO 开销最大性能最差。3. COUNT (1) FROM user → 数行数的 “工具人”sqlSELECT COUNT(1) FROM user; -- 返回4 关键1是固定常量永远不为 NULL所以会统计表里所有行不管字段有没有空值。4. COUNT (*) FROM user → 官方认证的 “行数统计王”sqlSELECT COUNT(*) FROM user; -- 同样返回4 关键和 COUNT (1) 结果完全一样但语义更清晰 —— 一看就知道是 “统计总行数”。最易踩坑COUNT (列名) ≠ COUNT (*)sqlSELECT COUNT(name) FROM user; -- 返回2只算name非NULL的行 SELECT COUNT(age) FROM user; -- 返回2只算age非NULL的行划重点COUNT (列名) 会跳过 NULL 值COUNT (*) 和 COUNT (1) 会统计所有行性能实测1000 万行订单表对比差距肉眼可见表格写法执行方式性能等级避坑提醒SELECT 1 FROM t索引中等不加 LIMIT 会返回千万行数据SELECT * FROM t全表扫描最慢生产环境用 纯纯找事COUNT(1)索引扫描最快和 COUNT (*) 性能没区别COUNT(*)索引扫描最快官方推荐的统计写法COUNT (列名)索引 / 全表扫描中等要判断 NULL比 COUNT (*) 慢 10-20%select 1 走索引select * 走全表扫描count(1count(*) 走索引实战场景用对 性能翻倍场景 1判断记录是否存在最常用❌ 千万别这么写慢到离谱sqlSELECT COUNT(*) FROM user WHERE id 100;✅ 正确写法找到第一条就返回秒出结果sqlSELECT EXISTS(SELECT 1 FROM user WHERE id 100);场景 2统计总行数语义 性能双优❌ 没必要的写法sqlSELECT COUNT(1) FROM orders;✅ 推荐写法谁看都懂性能一样sqlSELECT COUNT(*) FROM orders;场景 3统计非空数据比如 “有备注的订单数”sqlSELECT COUNT(remark) FROM orders; -- 只统计remark不为NULL的行场景 4开发调试仅限本地sqlSELECT * FROM user LIMIT 10; -- 必须加LIMIT只看10行够了避坑指南3 个高频错误踩一个亏一次坑 1觉得 “COUNT (1) 比 COUNT (*) 快”真相数据库优化器会把两者优化成同一个执行计划速度完全没区别坑 2用 COUNT (*) 判断 “有没有数据”❌ 错误示例sqlIF (SELECT COUNT(*) FROM user WHERE age 18) 0 ...✅ 正确示例sqlIF EXISTS(SELECT 1 FROM user WHERE age 18) ...坑 3SELECT 1 不加 LIMIT❌ 灾难写法1000 万行表会返回 1000 万个 1网络直接堵死sqlSELECT 1 FROM user;✅ 安全写法除非真要所有行否则必加 LIMITsqlSELECT 1 FROM user LIMIT 1;终极总结收藏版表格写法核心作用空值处理最佳使用场景SELECT 1返回常量 1不受 NULL 影响配合 EXISTS 做存在性检查SELECT *返回所有列数据显示 NULL仅开发调试加 LIMITCOUNT(1)统计总行数统计所有行与 COUNT (*) 等价可替代COUNT(*)统计总行数统计所有行首选语义最清晰COUNT (列名)统计非空行数跳过 NULL统计某列有效数据最后记一句统计行数用 COUNT (*)判断存在用 EXISTSSELECT 1SELECT * 只在本地调试用