关于php:2关于更好优化数据库设计的问题

2 question about better optimize database design

1) 在 mysql 引擎中,MyISAM 更好还是 InnoDB 更好?

2) 我想编写一个可以添加多类别帖子的 cms
我必须如何设计我的数据库以通过一些查询获得更好的性能?

在php中如何列出例如哪个类别= 1的帖子?

谢谢你


没有确定的答案,因为这取决于您的要求,但是很多人已经提到了诸如:

  • innodb 具有行级锁定与 myisam 表锁定,因此 innodb 可以处理更多并发请求。
  • innodb 是事务性的,因此插入通常比 myisam 慢
  • innodb 是一个适当的 RDBMS 引擎,因此支持引用完整性(事务 ACID bla bla bla)
  • innodb 比 myisam 更可靠
  • myisam 的读取速度比 innodb 快(神话)
  • myisam 表的占用空间比 innodb 的要小(神话)

然而,没有多少人会提到 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亿行论坛/话题示例

    MySQL 和 NoSQL:帮我选一个合适的

  • 1.25 亿行产品/类别示例

    重写mysql select以减少时间并将tmp写入磁盘

  • 亿行实验

    对于提供大量数据的查询的最佳 MySQL 设置?

  • Innodb vs. myisam vs. falcon 基准测试

    http://www.mysqlperformanceblog.com/2007/01/08/innodb-vs-myisam-vs-falcon-benchmarks-part-1/

希望这会有所帮助:)


1) 如果你需要 DB 级别的外键关系,请使用 InnoDB,否则使用 MyISAM

2) 您可以将所有类别存储在一个具有类似

架构的表中

1
2
3
4
5
create table categories (
Category_ID int NOT NULL,
ParentCategory_ID int NOT NULL default 0,
CategoryName varchar(150)
);

具有 Category_ID 主键

3)

1
2
$sql = select * from posts where category_id = 1;
mysql_query($sql);

edit : post 表的模式(示例)

1
2
3
4
5
6
create table posts (
    Post_ID int NOT NULL,
    Category_IDs varchar(50) NOT NULL,
    POSTDescription varchar(1000),
    POSTTime int NOT NULL
)

Post_IDposts 表的主键。

注意 Category_IDs 现在是 varchar 在其中存储类别的值,例如 1,2,3 如果您的帖子属于类别 1,2 和 3.. 并且要删除属于类别 1 的所有帖子,您将运行以下查询

1
2
3
$sql = DELETE
FROM `posts`
WHERE FIND_IN_SET( '1', `Category_IDs` ) >0;