sql优化
查询性能优化
1、使用 Explain 进行分析
比较重要的字段有:
select_type : 查询类型,有简单查询、联合查询、子查询等
key : 使用的索引
rows : 扫描的行数
2、优化数据访问
-
减少请求的数据量
只返回必要的列:最好不要使用 SELECT * 语句。
只返回必要的行:使用 LIMIT 语句来限制返回的数据。
缓存重复查询的数据:使用缓存可以避免在数据库中进行查询,特别在要查询的数据经常被重复查询时,缓存带来的查询性能提升将会是非常明显的。 -
减少服务器端扫描的行数
最有效的方式是使用索引来覆盖查询
3、重构查询方式
-
切分大查询
一个大查询如果一次性执行的话,可能一次锁住很多数据、占满整个事务日志、耗尽系统资源、阻塞很多小的但重要的查询。 -
分解大连接查询
将一个大连接查询分解成对每一个表进行一次单表查询,然后在应用程序中进行关联,这样做的好处有:- 让缓存更高效。对于连接查询,如果其中一个表发生变化,那么整个查询缓存就无法使用。而分解后的多个查询,即使其中一个表发生变化,对其它表的查询缓存依然可以使用。 - 分解成多个单表查询,这些单表查询的缓存结果更可能被其它查询使用到,从而减少冗余记录的查询。 - 减少锁竞争; - 在应用层进行连接,可以更容易对数据库进行拆分,从而更容易做到高性能和可伸缩。
合理使用索引
1、如果可以的话给频繁用来查询的字段加上索引,加快查询速度。
2、必要时可以添加联合索引,来覆盖返回结果。
3、注意最左前缀匹配,保证查询的sql语句按照创建的索引顺序来查找,避免创建冗余索引
4、用like进行模糊查询的时候不要使用‘%like%’,而尽量使用‘like%’的形式。另外使用regexp也是不会使用索引的。
5、如果字段使用了函数或者运算操作是不会使用索引的
6、多使用explain去分析sql语句
7、使用union代替or,因为or很多时候是不会使用索引的
一些sql优化案例
配置调优
- 选择合适的存储引擎,如果是一个不经常修改的表,而且不需要事务的支持,而且这个表经常要count(*),可以使用MyISAM,因为MyISAM没有行锁、事务这些东西,相对简单,性能更优。
- 对于修改频繁的表关闭mysql的缓存功能,因为如果这个表有修改的话,所有缓存都会失效,缓存没起到什么作用,反而加大了维护缓存的开销(配置query_cache_type)
- 开启slow_query_log慢查询日志,long_query_time可以根据业务设置,分析执行缓慢的sql语句
- 对于频繁操作数据库的业务,连接的时候wati_timeout 可以设置大一些,避免频繁创建连接
- 使用连接池