任何数据库应用都存在分页性能问题,mysql的性能问题似乎更大些。Discuz7.2(以下简称dz7.2)和Discuz X3(简称X3)的抢楼机制基本相同,抢楼与普通帖子(盖楼)是不同的处理机制。到了Discuz X3.0(简称X3.0)就把抢楼与盖楼机制统一。看似X3.0的处理方式更好,但实际上我认为因为缺乏DBA的支持,DZ因为mysql的弱智低能带来的称重包袱而导致开发正走向歧路。
先分析dz7.2/X3,X3.0各自的技术实现
dz7.2使用 postposition 表来保存后台“帖子优化”操作以及抢楼帖的信息,这两个功能使用的是同一个机制:
- CREATE TABLE `NewTable` (
- `tid` int(10) UNSIGNED NOT NULL ,
- `position` int(10) UNSIGNED NOT NULL ,
- `pid` int(10) UNSIGNED NOT NULL ,
- PRIMARY KEY (`tid`, `position`)
- )
复制代码
postposition.position与tid配合决定跟帖的列表顺序。当新抢楼跟帖入库时调用savepostposition($tid, $pid);
复制代码
来更新postposition表
- function savepostposition($tid, $pid, $position = 0) {
- global $db, $tablepre;
- if(!$position) {
- $pos = $db->result_first("SELECT max(position) FROM {$tablepre}postposition WHERE tid='$tid'");
- $pos ++;
- } else {
- $pos = $position;
- }
- $res = $db->query("INSERT INTO {$tablepre}postposition SET tid='$tid', position='$pos', pid='$pid'");
- return $res;
- }
复制代码
X3的处理机制与dz7.2基本相同,不同之处在于取消了后台帖子优化操作, postposition表仅供抢楼帖使用,此表的position字段变成自增长字段:<div class="blockcode"><div id="code_sL4"><ol>
CREATE TABLE `NewTable` (
`tid` mediumint(8) UNSIGNED NOT NULL ,
`position` int(10) UNSIGNED NOT NULL AUTO_INCREMENT , -- |