当前位置: 首页 > 图文教程 > 网络编程 > PHP > PHP + MySQL 分表减低数据库压力

PHP
让我们来编写一些PHP实用的脚本
七种缓存使用武器 为网站应用和访问加速
动态网页PHP中引用&的使用注意事项
在PHP中全面阻止SQL注入式攻击
PHP自带可以代替echo调试的unit函数
小结:PHP动态网页程序优化及高效提速问题
php对特殊语句查询结果进行数组排序
实例:用PHP技术解决网站URL格式过长的问题
小结:PHP动态网页程序两个有用的小技巧
动态网页中直接不让访问PHP程序文件
网页实例:详细介绍用PHP来编写网页记数器
菜鸟学习:动态网页PHP基础学习笔记
利用Apache实现禁止图片盗链
PHP编程中常用的三则技巧
PHP制作的网站意见在线反馈表
大型Web需求解决方案 PHP定位突出
PHP实例:精确到每一秒钟的在线人数显示代码
实用:动态网页制作技术PHP的十个应用技巧
常见php页面漏洞分析及相关问题解决
PHP和MYSQL制作动态网站开发经验之谈

PHP + MySQL 分表减低数据库压力


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-08-14   浏览: 133 ::
收藏到网摘: n/a

以下是我对使用 PHP + MySQL 处理负载过重的数据库问题思考和总结,经验方面一定有着不少欠缺的地方,欢迎高手前来指教:

在设计时考虑合理的表结构和相应大概要承受多少访问压力,需不需要分表,如果需要分表每个表放多少条记录合适;

对于分表的实现可以采用 PHP 处理或是 MySQL 自带的 MERGE 表类型(即 MRG_MyISAM)来处理:

⑴如果是使用 PHP 处理有两种情况:

①没有数据的新库新表要为抗压做准备,比如一个聊天室一开始就要考虑可能有多个子聊天室,可以根据一些条件来进行,例如按照主键或是 ID 的范围得出一种算法在存储时就按照相应算法分配存储到同结构但不同名的表中;

②如果是对已经有大量数据需要减压的数据库可以按照一定规则,比如按照该表的访问频率多少,把常用的数据放到一个表中,很少访问的数据放到另一张表中,访问数据时先访问常用表,找不到时再访问非常用表。

⑵如果采用 MySQL 自带的分表方式处理,就是使用 MySQL 的 MERGE 表类型(即 MRG_MyISAM)。这种时候一般是针对已有教多数据,单个数据表无法承受负载时才会使用这种方式,可以针对这个教大的表使用一些工具比如 phpMyadmin 来对相关表的类型进行修改,同时确定分表中每个表里的记录数,不过这个操作需要慎重,除了首次分表外,以后的数据将加到最后一个子表中,想要再分时就需要手动处理,编辑相关的“表明 .MRG”文件了,同时还要处理新的子表的“ALTER TABLE tablename AUTO_INCREMENT = xxx”。

采用 MERGE 表时需要注意手册中提到的一些问题: ①如果你使用 ALTER TABLE 来把 MERGE 表变为其它表类型,到底层表的映射就被丢失了。取而代之的,来自底层 MyISAM 表的行被复制到已更换的表中,该表随后被指定新类型。

②REPLACE 不起作用。

③没有 WHERE 子句,或者在任何被映射到一个打开的 MERGE 表上的任何一个表上的 REPAIR TABLE,TRUNCATE TABLE,OPTIMIZE TABLE 或 ANALYZE TABLE,你不能使用 DROP TABLE,ALTER TABLE,DELETE FROM。如果你这么做了,MERGE 表将仍旧指向原始表,这样产生意外结果。解决这个不足最简单的办法是在执行任何一个这些操作之前发出一个 FLUSH TABLES 语句来确保没有 MERGE 表仍旧保持打开。

④一个 MERGE 表不能在整个表上维持 UNIQUE 约束。当你执行一个 INSERT,数据进入第一个或者最后一个 MyISAM 表(取决于 INSERT_METHOD 选项的值)。MySQL 确保唯一键值在那个 MyISAM 表里保持唯一,但不是跨集合里所有的表。

⑤当你创建一个 MERGE 表之时,没有检查去确保底层表的存在以及有相同的机构。当 MERGE 表被使用之时,MySQL 检查每个被映射的表的记录长度是否相等,但这并不十分可靠。如果你从不相似的 MyISAM 表创建一个 MERGE 表,你非常有可能撞见奇怪的问题。

⑥在 MERGE 表中的索引的顺序和它的底层表中的索引应该一样。如果你使用 ALTER TABLE 给一个被用在 MERGE 表中的表添加一个 UNIQUE 索引,然后使用 ALTER TABLE 在 MERGE 表上添加一个非唯一索引,如果在底层表上已经有一个非唯一索引,对表的索引排序是不同的。(这是因为 ALTER TABLE 把 UNIQUE 索引放在非唯一索引之前以利于重复键的快速检测 )。因此对使用这样索引的表的查询可能返回不期望的结果。

⑦在 Windows中,在一个被 MERGE 表使用的表上 DROP TABLE 不起作用,因为 MERGE 引擎的表映射对 MySQL 的更上层隐藏。因为 Windows 不允许已打开文件的删除,你首先必须刷新所有 MERGE 表(使用 FLUSH TABLES)或在移除该表之前移除 MERGE 表。