【问题标题】:2 question about better optimize database design2关于更好地优化数据库设计的问题
【发布时间】:2011-08-06 06:19:39
【问题描述】:

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

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

在 php 中如何列出帖子类别,例如 = 1?

谢谢

【问题讨论】:

    标签: php mysql database-design database-optimization


    【解决方案1】:

    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_IDposts 表的主键。

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

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

    【讨论】:

    • 不不!我有一个类似于您的类别表的类别表,我想要一个用于 posts_categories 的表来存储帖子的所有类别,
    • 关于问题1,什么时候需要外键?
    • 您的意思是在您的情况下一个帖子可以属于多个类别?当你想链接两个表时,你需要外键。例如如果您希望您的帖子与其类别相关联,那么您将把 Category_ID 作为帖子表中的外键。
    • 有可能为此提供完整的结构吗?
    • 例如,如果对于 post_id = 1,我的 5 个类别中有 2 个类别,这 2 个类别如何存储?
    【解决方案2】:

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

    • 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/

    另外,看看下面的例子和文章(第二个例子可能有特别的相关性)

    希望这会有所帮助:)

    【讨论】:

    • 参照完整性与 DBMS(更不用说数据库)是否是关系数据库无关。 MySQL 基于 SQL,这意味着它不是真正的关系型。与使用 MyISAM 相比,使用 InnoDB 不会使 MySQL 或多或少成为 RDBMS。
    • 编辑后的帖子包括(不是正确的 RDBMS - ACID bla bla bla bla),但它是基于读取性能的答案。
    • @Ummar,我正在纠正答案中可能具有误导性的信息。我没有以任何方式批评这个问题,我不知道你为什么会有我的印象。
    • 别担心,伙计们 - 冷静,我在匆忙中掩盖了一些事实,以切入正题。
    猜你喜欢
    • 2011-10-26
    • 2021-07-03
    • 1970-01-01
    • 2010-09-13
    • 2012-04-05
    • 2020-01-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多