sql优化

SQL语句方面

1)写明查询具体某几列,减少*的使用

=》因为使用 * 号,数据库还得查询数据字典,然后解析列名,直接写列名会提高效率;

=》只有用到的列才查出来,可以减少数据量

 

2)删除所有记录的时候,用TRUNCATE替代DELETE

=》因为delete删除表时,会扫描整个表,然后再一条一条的删除;而TRUNCATE是一次性删除整个表的所有内容,会提高效率;

 

3)在使用分组查询时,二者都能使用时,尽量使用where子句代替having子句

=》因为where限制性,having后执行;having会先分组,比较占内存;

 

4)多用内部函数提高SQL效率

=》例如用concat()连接函数,代替'||'的符号连接(||是ORACLE的语法)

 

5)表名过长时,尽量使用表的别名

=》因为长表名更加的耗费扫描时间

=》这里的意思不是说建表时的表名,而是指在写SQL语句时,因为我们经常会用到表名.列名

在SQL语句中一旦指定了表别名,则不能再使用"表名称.列名"格式,只能使用"表别名.列名"格式来引用列.

SELECT * FROM demo_class AS t1 WHERE t1.`class_unid`='1'

列的别名就没这么必要了

 

6)尽量使用多表连接查询,避免子查询

=》子查询效率特别低,而一般的子查询都可以由关连查询来实现相同的功能,关联查询的效率要提高很多,所以建议在数据查询时避免使用子查询(尤其是在记录很多时),而最好用关联查询来实现。

=》

MySQL从4.1版本开始支持子查询,使用子查询进行SELECT语句嵌套查询,可以一次完成很多逻辑上需要多个步骤才能完成的SQL操作。子查询虽然很灵活,但是执行效率并不高。

子查询:把内层查询结果当作外层查询的比较条件

执行子查询时,MYSQL需要创建临时表,查询完毕后再删除这些临时表,所以,子查询的速度会受到一定的影响,这里多了一个创建和销毁临时表的过程。

优化方式:可以使用连接查询(JOIN)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快。

举例:有班级表、学生表,我要查询年龄最大的学生所处的班级的名称

子查询和连接查询的对比就出来了
 
 
备注
1)这个模糊查询like的论述,我觉得是错误的
 
2)关于in和exists的效率比较,有点扯
 
3)where子句中的连接顺序(where也采用从右往左解析),这个不知是否有用
 
 
 
学习资料
 
 
 
为什么子查询比连接查询效率低   https://www.jianshu.com/p/cb1e14c0ac39
 
 
 
 
 
 
原文地址:https://www.cnblogs.com/syjp/p/10406915.html