SELECT *,而是查询具体的字段。反例:
SELECT * FROM PERSON;
规范书写:
SELECT ID,NAME,AGE FROM PERSON;
limit 1规范书写:
SELECT ID,NAME,AGE FROM PERSON WHERE NAME = 'TOM' LIMIT 1;
原因:
limit 1主要作用是为了防止全表扫描,如果NAME是唯一索引的话,加不加limit的差别就不大了。
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';
反例:
SELECT ID,NAME,AGE FROM PERSON WHERE AGE - 1 = 10;
规范书写:
SELECT ID,NAME,AGE FROM PERSON WHERE AGE = 11;
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的优化原则就是:小表驱动大表,小的数据集驱动大的数据集。