【HPTypecho】HPTypecho数据表说明

这里简单说明一下HPTypecho的表结构,方便大家自己使用sql插入数据,毕竟使用接口导入,数据量上来了会很慢。

### 总体思路
由于需要尽可能兼容typecho原来的表结构和代码逻辑,所以这次表的改动,并没有什么高深的技术,只是将查询耗时的地方(表或者join查询等),做了个简单的拆分。

简单来说,就是通过下面几个思路来优化性能:

1. 给表分区,提高IO效率
2. 对大表进行垂直拆分,减少查询时不必要的数据传输
3. 再对relationship信息做一份冗余数据,避免join表查询时性能太低

### 表分析
首先,先看看有哪些表。

mysql> show tables;
+————————-+
| Tables_in_hpte |
+————————-+
| typecho_comments |
| typecho_contents |
| typecho_contents_extend |
| typecho_contents_index |
| typecho_contents_source |
| typecho_fields |
| typecho_metas |
| typecho_options |
| typecho_relationships |
| typecho_users |
+————————-+

>其中,`typecho_contents`是视图(view)

1. `typecho_contents_source`表,继承了原来`typecho_contents`的大部分字段,但`text`字段除外
2. `typecho_contents_extend`表,继承了原来`typecho_contents`的text字段。换句话说,原来的`typecho_contents`表拆分成了`typecho_contents_source`和`typecho_contents_extend`两张表
3. `typecho_contents_index`表主要用于对文章进行索引,但由于中文搜索准确率非常低,所以一般情况下不需要关注这张表,除非你是做英文网站。
4. `typecho_contents`表,HPTypecho中的这个表,其实是个View,主要是为了兼容Typecho而存在。插入数据的时候,**请不要往这里插入数据。**

#### 1. `typecho_contents_source`详细说明:

CREATE TABLE `typecho_contents_source` (
`cid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`slug` varchar(200) DEFAULT NULL,
`created` int(10) unsigned DEFAULT ‘0’,
`modified` int(10) unsigned DEFAULT ‘0’,
`order` int(10) unsigned DEFAULT ‘0’,
`authorId` int(10) unsigned DEFAULT ‘0’,
`template` varchar(32) DEFAULT NULL,
`type` varchar(16) DEFAULT ‘post’,
`status` varchar(16) DEFAULT ‘publish’,
`password` varchar(32) DEFAULT NULL,
`commentsNum` int(10) unsigned DEFAULT ‘0’,
`allowComment` char(1) DEFAULT ‘0’,
`allowPing` char(1) DEFAULT ‘0’,
`allowFeed` char(1) DEFAULT ‘0’,
`parent` int(10) unsigned DEFAULT ‘0’,
`ext_categories` varchar(128) DEFAULT NULL,
PRIMARY KEY (`cid`),
UNIQUE KEY `slug` (`slug`),
KEY `created` (`created`),
FULLTEXT KEY `ext_categories` (`ext_categories`)
) ENGINE=MyISAM AUTO_INCREMENT=500005 DEFAULT CHARSET=utf8

这个表继承了原来`typecho_contents`的大部分字段,但`text`字段除外。这个字段内容比较长,所以将其拆分到了另外一个表`typecho_contents_extend`中。

这样,在列表页面(分类、搜索、标签聚合页等),如果不需要显示文章内容,就直接从这个表查即可。

此表中还有个`ext_categories`字段,后文说明,此处不表。

#### 2. `typecho_contents_extend`详细说明:

CREATE TABLE `typecho_contents_extend` (
`cid` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(200) DEFAULT NULL,
`text` text,
PRIMARY KEY (`cid`)
) ENGINE=MyISAM AUTO_INCREMENT=500005 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY HASH (cid)
PARTITIONS 128 */

这个表继承了原来`typecho_contents`中的title和text字段,并且通过cid和`typecho_contents_source`关联起来。此表还进行了128分区,以此提高join等联表查询操作的性能。

**所以,各位同学如果需要自己往数据库插入数据,则需要将数据分别插入`typecho_contents_source`和`typecho_contents_extend`表,并且通过cid进行关联。**

#### 3. `ext_categories`字段说明
`typecho_contents_source`中有个`ext_categories`,这里主要是用于冗余分类信息的(名字取得不好,其实也冗余了标签信息)。

原来Typecho的时候,查询某个分类下的文章时,需要联合`replationship`表和`meta`表进行查询, 文章多了之后,效率非常低。现在冗余了`ext_categories`字段,那么直接从`typecho_contents_source`即可查到某个分类(或者某个标签)下的文章,效率极大提升。

**提醒:**在通过SQL插入数据时,可以先不理会`ext_categories`的值。在插入完成之后,再执行源代码tools目录下的`fix_metas.php`脚本,即可补全此字段。

上一篇 2016-08-31 下午12:17
下一篇 2016-09-02 上午2:22