1.当数据量较大时,连接查询一般要比子查询速度要快,但连接查询查出来的结果可能有重复的,需要根据实际情况来做取舍。
2.where和having区别:
(1)where在分组前过滤,having在分组后过滤
(2)having 字段必须是查询出来的,where 字段必须是数据表存在的。
(3)where 不可以使用字段的别名,having 可以。因为执行WHERE代码时,可能尚未确定列值。
(4)where 不可以使用合计函数。一般需用聚合函数才会用 having
3.left join on 后跟and和where区别
(1)ON条件是在生成临时表时使用的条件,它不管ON中的条件是否为真,都会返回左边表中的记录;
(2)WHERE条件是在临时表生成好后,再对临时表进行过滤的条件。这时已经没有LEFT JOIN的含义(必须 返回左边表的记录)了,条件不为真的就全部过滤掉;
(3)AND 是过滤之后再连接,WHERE是连接之后再过滤。
(4)而inner jion没这个特殊性,则条件放在on中和where中,返回的结果集是相同的。
4.仅列出需要查询的字段,这对速度不会明显的影响,主要是考虑节省应用程序服务器的内存。
原来语句: select * from admin
优化为: select admin.id,admin.name,admin.password from admin(理论上是这样说,但一般大家都会偷懒吧)
5.负向条件查询不能使用索引
select * from order where status!=0 and stauts!=1
not in/not exists都不是好习惯
6.如果明确知道只有一条结果返回,limit 1能够提高效率
因为你知道只有一条结果,但数据库不知道呀
7.不同字符集,导致全表扫描
两个表的字段名相同,字符集不同。left join的时候导致全表扫描
8.能使用 count(*) or count(1)就不要使用 count(id)
9.尽量避免在列上做运算,这样导致索引失效
原语句: select * from use where year(use_time)>2018
优化为: select * from use where use_time> '2018-01-01′
10.能使用索引就不要全表查询(废话一句,但因为我们平常练习的习题一般数据较小看不出,但到业务上时区别就比较的大了)