【发布时间】:2011-08-06 06:19:39
【问题描述】:
1) 在 mysql 引擎中,MyISAM 更好还是 InnoDB 更好?
2) 我想编写一个可以添加 多类别 的帖子的 cms 我必须如何设计我的数据库以通过一些查询获得更好的性能?
在 php 中如何列出帖子类别,例如 = 1?
谢谢
【问题讨论】:
标签: php mysql database-design database-optimization
1) 在 mysql 引擎中,MyISAM 更好还是 InnoDB 更好?
2) 我想编写一个可以添加 多类别 的帖子的 cms 我必须如何设计我的数据库以通过一些查询获得更好的性能?
在 php 中如何列出帖子类别,例如 = 1?
谢谢
【问题讨论】:
标签: php mysql database-design database-optimization
1) 如果您需要 DB 级别的外键关系,请使用 InnoDB,否则请使用 MyISAM
2)您可以将所有类别存储在一个具有类似架构的表中
create table categories (
Category_ID int NOT NULL,
ParentCategory_ID int NOT NULL default 0,
CategoryName varchar(150)
);
使用 Category_ID 主键
3)
$sql = select * from posts where category_id = 1;
mysql_query($sql);
编辑:发布表的架构(示例)
create table posts (
Post_ID int NOT NULL,
Category_IDs varchar(50) NOT NULL,
POSTDescription varchar(1000),
POSTTime int NOT NULL
)
Post_ID 是posts 表的主键。
注意 Category_IDs 现在是 varchar 存储类别的值,例如 1,2,3 如果您的帖子属于类别 1,2 和 3.. 并且要删除属于类别 1 的所有帖子,您将运行以下查询
$sql = DELETE
FROM `posts`
WHERE FIND_IN_SET( '1', `Category_IDs` ) >0;
【讨论】:
Category_ID 作为帖子表中的外键。
没有确定的答案,因为这取决于您的要求,但是很多人已经提到了诸如:
然而,没有多少人会提到 innodb 聚集主键索引,以及因此设计良好的 innodb 表如何轻松胜过等效的 myisam 表。
这里有两个解释聚集索引的链接:
http://dev.mysql.com/doc/refman/5.0/en/innodb-index-types.html
http://www.xaprb.com/blog/2006/07/04/how-to-exploit-mysql-index-optimizations/
另外,看看下面的例子和文章(第二个例子可能有特别的相关性)
5 亿行论坛/线程示例
1.25 亿行产品/类别示例
Rewriting mysql select to reduce time and writing tmp to disk
一亿行实验
Optimal MySQL settings for queries that deliver large amounts of data?
Innodb vs. myisam vs. falcon 基准测试
http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/
希望这会有所帮助:)
【讨论】: