【Mysql】积累四

来源:互联网 发布:淘宝老客户怎么维护 编辑:程序博客网 时间:2024/05/22 06:42

16. 垂直分区

垂直分区是为了优化表结构而对其进行纵向拆分的行为。

示例 1: 你可能会有一张用户表,包含家庭住址,而这个不是一个常用数据。这时候你可以选择把表拆分开,将住址信息保存到另一个表中。这样你的主用户表就会更小。如你所知,表越小越快。

示例 2: 表中有一个 “last_login” 字段,用户每次登录网站都会更新这个字段,而每次更新都会导致这个表缓存的查询数据被清空。这种情况下你可以将那个字段放到另一张表里,保持用户表更新量最小。

不过你也需要确保不会经常联合查询分开后的两张表,要不然你就得忍受由这带来的性能下降。

17. 拆分大型DELETE或INSERT语句

如果你需要在网站上执行大型DELETE或INSERT查询,则需要注意不要影响网络流量。当执行大型语句时,它会锁表并使你的Web应用程序停止。

Apache运行许多并行进程/线程。 因此它执行脚本效率很高。所以服务器不期望打开过多的连接和进程,这很消耗资源,特别是内存。

如果你锁表很长时间(如30秒或更长),在一个高流量的网站,会导致进程和查询堆积,处理这些进程和查询可能需要很长时间,最终甚至使你的网站崩溃。

如果你的维护脚本需要删除大量的行,只需使用LIMIT子句,以避免阻塞。

while (1) {    mysql_query("DELETE FROM logs WHERE log_date

18.越少的列越快

对于数据库引擎,磁盘可能是最重要的瓶颈。更小更紧凑的数据、减少磁盘传输量,通常有助于性能提高。

MySQL文档 Storage Requirements 有所有数据类型清单。

如果已知表具有很少的行,则没有理由是主键类型为INT,可以用MEDIUMINT、SMALLINT代替,甚至在某些情况下使用TINYINT。 如果不需要完整时间记录,请使用DATE而不是DATETIME。

确保留下合理的扩展空间,不然你可能会像Slashdot这样。

19. 选择正确的存储引擎

MySQL有两个主要存储引擎,MyISAM和InnoDB。每个都有自己的优点和缺点。

MyISAM适用于读取繁重的应用程序,但是当有很多写入时它不能很好地扩展。 即使你正在更新一行的一个字段,整个表也被锁定,并且在语句执行完成之前,其他进程甚至无法读取该字段。 MyISAM在计算SELECT COUNT(*)的查询时非常快。

InnoDB是一个更复杂的存储引擎,对于大多数小的应用程序,它比MyISAM慢。但它支持基于行的锁定,使其更好地扩展。 它还支持一些更高级的功能,比如事务。

20. 使用对象关系映射器(ORM, Object Relational Mapper)

通过使用ORM(对象关系映射器),你可以获得一定的性能提升。ORM可以完成的一切事情,手动编码也可完成。但这可能意味着需要太多额外的工作,并且需要高水平的专业知识。

ORM以“延迟加载”著称。这意味着它们仅在需要时获取实际值。但是你需要小心处理他们,否则你可能最终创建了许多微型查询,这会降低数据库性能。

ORM还可以将多个查询批处理到事务中,其操作速度比向数据库发送单个查询快得多。

目前我最喜欢的PHP-ORM是Doctrine。

0 0
原创粉丝点击