MySQL优化20条经验(三)

16.垂直分割mysql

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

     使用场景: 数据库

    1.一些不经常使用的字段,能够分割成新的表;apache

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

   注意,被分离出去的造成的表,不要常常去Join他们,否则,他们的性能比不分割时还要差,并且,会是极数极降低。服务器

 

17.拆分大的DELETE或INSERT语句app

     若是你的一个在线网站的去执行去执行一个很大的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运行在阶段环境中,会建立不少的子进程。

相关文章
相关标签/搜索