今天看到了一篇关于网站架构的文章,写的很好,改了改,添加了一些自己的想法:
对于大流量高并发的网站,首先考虑的都是如何用最少的资源处理最多的业务。一般来说,网站架构最初需要考虑三个方面:数据库瓶颈、代码执行效率和服务器端的配置。下面结合项目开发中经验总结一下。
1. 合理设计与使用数据库
对于数据库的瓶颈可以归纳为两点:如何设计高性能的数据库?如何使用设计出来的高性能数据库?
首先,设计数据库之初就应该预估可能产生的数据量和所能承受的压力:该分表的分表,该分区的分区,该建立索引的就建立针对类型的索引,该读写分离的就趁早的做好数据库主从或者数据库集群。虽然大多数互联网公司都有专业的DBA,但是需求第一线的码农必须具有设计优秀数据库的能力。
其次,合理使用数据库,基础的概念已经老生常谈的内容:尽量少用或者不用JOIN、IN和GROUP BY等查询和临时表、数据库端编程、配置my.cnf记录慢查询、增加查询内存等。关于JOIN查询,每次JOIN都是两个表数据量的乘积(笛卡尔积),所以尽可能的在程序中处理。关于数据库段编程,我以前倒是经常在SQL Server中写存储过程和触发器,不过在MySQL中除非迫不得已一般都不会使用这些自定义函数,因为数据库的压力已经很大了。不过类似淘宝那种特征量对特征值的设计有时候是不可避免的使用多个JOIN查询的,这个就需要专业的DBA去从底层优化了。
下面这个SQL语句是一个很典型的反面教程,8000条数据卡死了,要是有人当着我的面写这样的查询我就地干掉他:
SELECT COUNT(*) FROM `dbkxdhk`.`shop_goods` AS g ,(SELECT goods_id, attr_valueAS cut FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=2) AS cut,(SELECT goods_id, attr_value AS color FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=3)AS color,(SELECT goods_id, attr_value AS symmetry FROM`dbkxdhk`.`shop_goods_attr` WHERE attr_id=6) AS symmetry,(SELECT goods_id, attr_value AS clarity FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=4) ASclarity,(SELECT goods_id, attr_value AS polish FROM `dbkxdhk`.`shop_goods_attr`WHERE attr_id=5) AS polish,(SELECT goods_id, attr_value AS cert FROM`dbkxdhk`.`shop_goods_attr` WHERE attr_id=8) AS cert,(SELECT goods_id, attr_value AS carat FROM `dbkxdhk`.`shop_goods_attr` WHERE attr_id=1) AS carat,(SELECT goods_id, attr_value AS location FROM `dbkxdhk`.`shop_goods_attr` WHEREattr_id=62) AS location,(SELECT goods_id, attr_value AS certificate FROM`dbkxdhk`.`shop_goods_attr` WHERE attr_id=8) AS certificate WHERE g.goods_id = cut.goods_id AND g.goods_id = color.goods_id AND g.goods_id = symmetry.goods_idAND g.goods_id = clarity.goods_id AND g.goods_id = polish.goods_id ANDg.goods_id = cert.goods_id AND g.goods_id = carat.goods_id AND g.goods_id = location.goods_id AND g.goods_id = certificate.goods_id AND g.is_on_sale = 1 ANDg.cat_id=1 AND g.is_alone_sale = 1 AND g.is_delete = 0 AND g.cat_id IN('1','2','7','9','8')最后,关于数据库缓存,现在一般都使用Memcache,PHP等语言也已经对Memcache提供了足够多的支持。此外也可以优化下数据库自身的缓存设置,例如增加查询内存等。而Key-Value的NoSQL的火爆能否完全解决关系型数据库的瓶颈这个我也没有实际的经验,我只能说在某些领域内或许NoSQL可以帮助我们更好的使用关系型数据库。
$sql = "SELECT * FROM test WHERE id=$id"; $arr["key"] = $value;不过,zend在编译PHP代码的时候,如果是双引号的字符串,会首先针对整个字符串进行一次扫描以判断这个字符串是否有需要被替换的变量存在,而单引号的字符串则不会存在这个问题,所以说单引号字符串的执行效率是要高于双引号字符串的。
$sql = 'SELECT * FROM test WHERE id='.$id; $arr['key'] = $value;不要觉的这样的写法吹毛求疵,如果一个系统庞大的一定地步,这样的效率损失的绝对要避免的。