【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_sourcetypecho_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_sourcetypecho_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脚本,即可补全此字段。


版权声明:未经书面授权禁止转载、摘编、复制或建立镜像。对既成事实本站将保留所有的权利。

无相关文章

评论已关闭