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