文章目录
SQL语句书写规范
1、查询语句尽量避免使用SELECT *
,而是查询具体的字段。
反例:
SELECT * FROM PERSON;
规范书写:
SELECT ID,NAME,AGE FROM PERSON;
2、知道查询结果只有一条或者只要最大/最小的一条记录,建议使用limit 1
规范书写:
SELECT ID,NAME,AGE FROM PERSON WHERE NAME = 'TOM' LIMIT 1;
原因:
limit 1
主要作用是为了防止全表扫描,如果NAME是唯一索引的话,加不加limit的差别就不大了。
3、尽量避免在WHERE子句中
使用OR
来连接条件
反例:
SELECT ID,NAME,AGE FROM PERSON WHERE AGE = 10 OR NAME = 'TOM';
规范书写:
-- 使用 UNION ALL
SELECT ID,NAME,AGE FROM PERSON WHERE AGE = 10
UNION ALL
SELECT ID,NAME,AGE FROM PERSON WHERE NAME = 'TOM';
-- 或者分开两条SQL写(有点傻)
SELECT ID,NAME,AGE FROM PERSON WHERE AGE = 10;
SELECT ID,NAME,AGE FROM PERSON WHERE NAME = 'TOM';
4、尽量避免在WHERE子句中对字段进行表达式操作
反例:
SELECT ID,NAME,AGE FROM PERSON WHERE AGE - 1 = 10;
规范书写:
SELECT ID,NAME,AGE FROM PERSON WHERE AGE = 11;
5、exists
和 in
的合理利用
业务场景:假设表A表示某企业员工表,表B表示部门表,现在要查询所有部门的所有员工
大多数写法:
SELECT * FROM A WHERE DEPTID IN (SELECT DEPTID FRON B);
用exist实现:
SELECT * FROM A WHERE EXISTS (SELECT 1 FROM B WHERE A.DEPTID = B.DEPTID);
exists
和 in
的区别:
exists先查主查询,而in先查子查询。因此,如果B的数据量小于A,适合用in;否则用exists.
Mysql的优化原则就是:小表驱动大表,小的数据集驱动大的数据集。