任何地方都不要使用 select * from t ,用具体的字段列表代替“*”,不要返回用不到的任何字段。
in 和 not in 也要慎用,否则会导致全表扫描,如:
select id from t where num in(1,2,3)
#对于连续的数值,能用 between:
select id from t where num between 1 and 3
也可以使用 exits 或 not exits 来代替
对查询,首先应考虑在 where 及 order by 涉及的列上建立索引,应尽量避免全表扫描。
应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描。
应尽量避免在 where 子句中使用 or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描,如:
select id from t where num=10 or num=20
#可以这样查询:
select id from t where num=10
union all
select id from t where num=20
优化索引失效问题。 链接:索引失效的情况
用TRUNCATE替代DELETE
连接比子查询的效率高
用Where子句替换HAVING子句
--NO.1 IN的写法
SELECT * FROM TABLEA A WHERE
A.ID IN
( SELECT ID FORM TABLEB B WHERE B.ID>1)
--NO.2 exists 写法
SELECT * FROM TABLEA A WHERE
EXISTS (
SELECT 1 FROM TABLEB B WHERE A.ID=B.ID AND B.ID>1)