关于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/

希望这会有所帮助:)

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


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_ID 是 posts 表的主键。

注意 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;
  • 不,不 !我有一个类似于您的类别表的类别表,我想要一个用于 posts_categories 的表来存储帖子的所有类别,
  • 关于问题1,什么时候需要外键?
  • 你的意思是在你的情况下一个帖子可以属于多个类别?当你想链接两个表时,你需要外键。例如您希望您的帖子与其类别相关联,那么您将 Category_ID 作为帖子表中的外键。
  • 有可能为此提供完整的结构吗?
  • 例如,如果对于 post_id = 1,我的 5 个类别中有 2 个类别,那么这 2 个类别如何存储?
  • 嗯,在这种情况下,上述架构将不起作用,帖子表需要对架构进行一些更改,让我更新我上面的帖子。
  • @Ummar,你太棒了,谢谢,让我在大数据库中测试 find_in_set 速度来测试优化和查询时间长度。
  • @Davood,你很高兴,有一件事告诉你,如果你需要 find_in_set 的最大性能,那么将 Category_IDs 的列类型更改为 SET。作为 find_in_set 对集合执行位操作。
  • 谢谢 Ummar,但是类别 id 的范围是未知的,这意味着无法将 varchar 更改为 set,有什么想法吗?
  • 是的,这是一个问题,但您可以为 set 提供任意范围,例如最大期望值,例如 1000 ……不是一个好方法,而是一个工作 arround..


来源:https://www.codenong.com/5675916/

微信公众号
手机浏览(小程序)

Warning: get_headers(): SSL operation failed with code 1. OpenSSL Error messages: error:14090086:SSL routines:ssl3_get_server_certificate:certificate verify failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(): Failed to enable crypto in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57

Warning: get_headers(https://static.shanhubei.com/qrcode/qrcode_viewid_9118.jpg): failed to open stream: operation failed in /mydata/web/wwwshanhubei/web/wp-content/themes/shanhuke/single.php on line 57
0
分享到:
没有账号? 忘记密码?