1. 云栖社区>
  2. PHP教程>
  3. 正文

MySQL优化的20条经验(三)

作者:用户 来源:互联网 时间:2017-12-01 19:43:41

mysql优化经验

MySQL优化的20条经验(三) - 摘要: 本文讲的是MySQL优化的20条经验(三), 16.垂直分割 “垂直分割”就是将一张表的数据按照列变成几张表的形式。 使用场景: 1.一些不常用的字段,可以分割成新的表; 2.一些需要被频繁刷新的字段:例如:有个叫“last_login”的字段,用户在每次登陆的时候他都会被更新。但是

16.垂直分割


“垂直分割”就是将一张表的数据按照列变成几张表的形式。


使用场景:


1.一些不常用的字段,可以分割成新的表;


2.一些需要被频繁刷新的字段:例如:有个叫“last_login”的字段,用户在每次登陆的时候他都会被更新。但是,每次更新的时候都导致该表的查询缓存被清空。所以,你需要帮这个字段放到另外一张表中,这样就不会影响其他字段的读取了。


注意,被分离出去的形成的表,不要经常去Join他们,不然,他们的性能比不分割时还要差,而且,会是极数极下降。

17.拆分大的DELETE或INSERT语句


如果你的一个在线网站的去执行去执行一个很大的DELETE或者INSERT查询,你需要非常小心,要避免网站停止响应。因为这些操作是会锁边的,表一锁住了,别的表就进步来了。


Apache会有很多的子进程或者线程。所以,工作起来是非常有效率的,而我们的服务器也不希望有太多的子进程,线程和数据库连接,这是极大的占用服务器的资源,尤其是内存。


如果你把表锁上一段时间,比如30秒,那么对于一个有很高访问量的站点来说,这30秒所积累的访问进程/线程,数据库连接,打开的文件数,可能不仅仅是让你的WEB服务Crash,还有可能让你的整台服务器挂了。


所以,如果你有一个大的处理,请一定将其拆分,使用Limit条件是一个好的方法。如:


while(1){


//每次只删掉1000条记录


mysql_query("DELETE FROM logs WHERE log_date <= '2009-11-01' LIMIT 1000");


if(mysql_affected_rows()==0){


//没的可删了,退出。


break;


}


usleep(6000);


}

18.越小的列会越快


对于大多数的数据库引擎来说,硬盘的操作可能是最重大的瓶颈。所以,将数据变得紧凑对这种情况非常有帮助,因为这减少了对硬盘的访问。


如果一张表只有几列(如:字典表、配置表),那么,我们就没有理由使用INT做主键,使用MEDIUMINT,SAMLLINT或者更新的TINYINT会更经济一些。如果不记录时间,使用DATE类型会比使用DATETIME好的多。


当然,你也要留有足够的空间,不然,你日后干这件事会死的很难看。

19.使用正确的存储引擎


MySQL中有两个引擎:MyISAM和InnoDB,每个引擎都个有利弊。


MyISAM使用一个大量查询的应用,但对于大量的写操作并不是很友好。甚至只是update一个字段,整张表都会被锁起来,而别的进程,就算是读进程都无法操作之到写操作完成。另外,MyISam对于SELECT COUNT(*) 这类的计算是超快无比的。


InnoDB的趋势会是一个非常复杂的存储引擎,对于一些小的应用,他会比MyISAM还慢。他是支持“行锁”,于是他在写操作比较多的时候,会更优秀。而且,他还支持跟多高级应用,比如:事务。

20.使用一个对象关系映射器(Object Relation Mapper)


使用ORM你能够获得可靠的性能增长。一个ORM可以做到事情,也能被手动编写出来。但是这需要一个高级专家。


ORM最重要的是"Lazy Loading",即:需要取值的时候才会去正真的去做。但是这种机制的副作用是:可能会因为要创建很多很小的查询反而会降低性能。


ORM还会把你的SQL语句打成一个包,这样比单独查询要快很多。


目前,个人最喜欢的PHP的ORM是:Doctrine。

21.小心“永久链接”


“永久链接”的目的是用来减少重现创建MySQL链接的次数。当一个链接被创建了,他会永久处于链接的状态,即使数据库操作已经结束。


PHP手册:mysql_pconnect()


这个貌似听起来不错,但由于你只有有限的链接数、内存、文件句柄数等,所以他也制造了不少的麻烦;而且,apache运行在阶段环境中,会创建很多的子进程。

以上是云栖社区小编为您精心准备的的内容,在云栖社区的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索mysql , 优化 经验 ,以便于您获取更多的相关知识。