sql优化

一,设计表之前

1,设计表之前尽量满足数据库设计三范式
2,应尽量避免全表扫描,在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描(null,or,!=,like,union all,表达式操作(num/2=100)),可以适当考虑(exists,order by )
3,适当使用临时表,例如,当需要重复引用大型表或常用表中的某个数据集时。但是,对于一次性事件,最好使 用导出表。
4,使用存储过程,尽量避免使用游标,因为游标的效率较差,如果游标操作的数据超过1万行,那么就应该考虑改写。
5,尽量避免大事务操作,提高系统并发能力。

实际处理过程

1.善用explain,看看自己写的sql到底要涉及到多少表,多少行,使用了那些索引,根据这些信息适当的创建索引;
2.善用不同的存储引擎,MySQL有多种不同的存储引擎,InnoDB,Aria,MEMORY根据需要给不同的表选择不同的存储引擎,比如要支持transaction的话用InnoDB等;
3.表很大的时候,做分片。

mysql一些优化思路

1.执行大的delete、update、insert操作要慎重,特别是对业务繁忙的系统,要尽量避免对线上业务产生影响。
解决办法是:大操作切割为小操作,使用limit子句限制每次操作的记录数,也可以利用一些日期字段基于更小粒度的时间范围进行操作。

2.避免使用select * 语句,select语句之用于获取需要的字段。

3.使用预编译语句,可以提高性能并且防范 sql注入 攻击。

4.一般情况下update,delete 语句中不要使用limit。

5.where 条件语句中必须使用合适的类型,避免mysql进行隐式转换。

6.insert into 必须显式指明字段名称,不要使用insert into table()。

7.避免在sql 语句中进行数学运算或函数运算,避免将业务逻辑和数据存储耦合在一起。

8.insert 语句如果使用批量提交,如insert into table values(),()…那么values 的个数不应过多。一次性提交过多记录,会导致I/O紧张,出现慢查询。

9.避免使用存储过程、触发器、函数等,这些特性会将业务逻辑与数据库耦合在一起,并且MySQL的存储过程,触发器,函数中可能存在bug。

10.尽量避免使用子查询,连接。尽量将子查询转化为连接查询,mysql 查询优化器会优化连接查询,但连接的表要尽可能的少,如果很多,可以考虑反范式设计。即对设计阶段做一些改造。

11.使用合理的sql语句以减少与数据库的交互次数。

12.建议使用合理的分页技术以提高操作效率。

小杨 wechat
这可以加我为好友!

热评文章