百万级数据下的mysql深度解析( 二 )


并且,固定长度的表也更容易被缓存和重建 。不过,唯一的副作用是,固定长度的字段会浪费一些空间,因为定长的字段无论你用不用,他都是要分配那么多的空间 。
 
垂直分割
“垂直分割”是一种把数据库中的表按列变成几张表的方法,这样可以降低表的复杂度和字段的数目,从而达到优化的目的 。需要注意的是,这些被分出去的字段所形成的表,你不会经常性地去Join他们,不然的话,这样的性能会比不分割时还要差,而且,会是极数级的下降 。
 
拆分大的 DELETE 或 INSERT 语句
如果在一个在线的网站上去执行一个大的 DELETE 或 INSERT 查询,你需要非常小心,要避免你的操作让你的整个网站停止相应 。因为这两个操作是会锁表的,表一锁住了,别的操作都进不来了 。
Apache 会有很多的子进程或线程 。所以,其工作起来相当有效率,而我们的服务器也不希望有太多的子进程,线程和数据库链接,这是极大的占服务器资源的事情,尤其是内存 。
如果你把你的表锁上一段时间,比如30秒钟,那么对于一个有很高访问量的站点来说,这30秒所积累的访问进程/线程,数据库链接,打开的文件数,可能不仅仅会让你泊WEB服务Crash,还可能会让你的整台服务器马上掛了 。
【百万级数据下的mysql深度解析】 
越小的列会越快
对于大多数的数据库引擎来说,硬盘操作可能是最重大的瓶颈 。所以,把你的数据变得紧凑会对这种情况非常有帮助,因为这减少了对硬盘的访问 。
 
选择正确的存储引擎
在 MySQL 中有两个存储引擎 MyISAM 和 InnoDB,每个引擎都有利有弊 。
MyISAM 适合于一些需要大量查询的应用,但其对于有大量写操作并不是很好 。甚至你只是需要update一个字段,整个表都会被锁起来,而别的进程,就算是读进程都无法操作直到读操作完成 。另外,MyISAM 对于 SELECT COUNT(*) 这类的计算是超快无比的 。
InnoDB 的趋势会是一个非常复杂的存储引擎,对于一些小的应用,它会比 MyISAM 还慢 。他是它支持“行锁”,于是在写操作比较多的时候,会更优秀 。并且,他还支持更多的高级应用,比如:事务 。





推荐阅读