目录
一、SQL语句基本结构
select */列名 from 表名
[ where 条件] #对整张表筛选
[group by 列名] #分组
[having 条件] #分组筛选
[order by ...] #排序
[limit ...] #分页
二、SQL语句执行顺序
-
from
-
on
-
join
-
where
-
group by(开始使用select中的别名,后面的语句中都可以使用)
-
avg,sum....
-
having
-
select
-
distinct
-
order by
-
limit
三、SQL优化
(1)基础优化
查询SQL尽量不要使用select *,而是具体字段 理由: select * 进行查询时,很可能不会用到索引,就会造成全表扫描
避免在where子句中使用or来连接条件 查询id为1或者薪水为3000的用户:
反例:
SELECT * FROM student WHERE id=1 OR salary=30000 正例: 使用union all
SELECT * FROM student WHERE id=1 UNION ALL SELECT * FROM student WHERE salary=30000 分开两条sql写
SELECT * FROM student WHERE id=1 SELECT * FROM student WHERE salary=30000 理由:
使用or可能会使索引失效,从而全表扫描 对于or没有索引的salary这种情况,假设它走了id的索引,但是走到salary查询条件时,它还得全表扫描。也就是说整个过程需要三步:全表扫描+索引扫描+合并。如果它一开始就走全表扫描,直接一遍扫描就搞定。虽然mysql是有优化器的,处于效率与成本考虑,遇到or条件,索引还是可能失效的 使用varchar代替char 反例:
deptname
char(100) DEFAULT NULL COMMENT '部门名称' 1 正例:
deptname
varchar(100) DEFAULT NULL COMMENT '部门名称' 1 理由:
varchar变长字段按数据内容实际长度存储,存储空间小,可以节省存储空间 char按声明大小存储,不足补空格 其次对于查询来说,在一个相对较小的字段内搜索,效率更高 尽量使用数值替代字符串类型 主键(id):primary key优先使用数值类型int,tinyint 性别(sex):0-代表女,1-代表男;数据库没有布尔类型,mysql推荐使用tinyint 查询尽量避免返回大量数据 如果查询返回数据量很大,就会造成查询时间过长,网络传输时间过长。同时,大量数据返回也可能没有实际意义。如返回上千条甚至更多,用户也看不过来。 通常采用分页,一页习惯10/20/50/100条。
使用explain分析你SQL执行计划 SQL很灵活,一个需求可以很多实现,那哪个最优呢?SQL提供了explain关键字,它可以分析你的SQL执行计划,看它是否最佳。Explain主要看SQL是否使用了索引。