Mysql学习笔记(二)——查询性能优化(一)

优化数据访问

1.只查询需要的数据。
  这个意思是指不要做返回大量结果然后在应用层进行筛选然后只选择了一部分。比如需要查询记录的前10条,返回了1000条,然后选择了10条就关闭了结果集。这样做会使得资源浪费在网络数据传输上面。
2.多表关联返回需要的列
 多表关联的时候切记不要返回全部的列,选择需要的列返回,而不是简单的使用*来返回全部的列,多余的列都是没用的数据。我们只要取需要的列。理由同上。
3.总是取出全部的列
 索引一章里面也谈到过,使用*会使得优化器无法完成覆盖索引的优化,如果没必要的话不要返回全部的列。
4.重复查询相同的数据
 重复查询不宜变的数据也是不必要的,可以把这份数据放在缓冲里面。

## 使用Explain命令 ##
我们可以通过explain来查看当前的select语句的属性,包括type,rows,extra等参考数据帮助完成判断是否扫描了额外的行。
我们一般可以建立索引来减少需要扫描的行数,但是我们虽然可以建立索引,但是怎么使用索引将会造成不同的性能差异。我们一般使用where来过滤数据,而使用where的方式从快到慢大概有三种:
1.在索引中使用where来过滤不必要的数据。这个是正确使用索引的基本,毕竟索引的目的便是过滤不必要的数据。
2.使用覆盖索引来获得数据。这个是指在索引中存储的字段数据来作为查询的结果返回,这个是覆盖索引的定义,避免了回表拉取数据的开销,用好了是很好的一种手段。
3.读取数据,然后在mysql服务器层来过滤数据。
我们来判断使用索引是否合理可以直观的从上面提到额explain所获得字段值来判断。如果扫描的行rows和实际返回的行差距很大,那么一般都是索引使用的有问题。

查询重构

切分成多个简单的查询
   1.1在应用层把一个复杂的查询切分成多个简单的查询发送到数据库服务器进行查询可以起到提高性能,减轻数据库压力的作用。比如,如果使用了一个长时间的查询语句,这个查询可能会导致数据被加行锁而无法被其他的事务更新,这样的话可能会导致其他事务长时间处于挂起状态。如果使用短小的查询就会好很多。在使用in+select子句查询的时候,如果先一步查询出select子句,然后使用结果集替换,那么一个关联查询就会变成 一个普通查询+普通查询,而这两个查询都是高性能的,应为可以使用索引,第二个in查询会在优化器的作用下使用二分查询从而进一步提升性能。
   1.2在数据库中切分查询。最常见的是在一个存储过程中删除大量的表数据,这种操作会导致长时间的占用锁导致其他的事务阻塞。分段进行会起到很好的作用。

你可能感兴趣的:(数据库优化)