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)代替子查询,连接查询不需要建立临时表,因此其速度比子查询快。
举例:有班级表、学生表,我要查询年龄最大的学生所处的班级的名称