2

我正在尝试优化我的 PHP 和 MySQL,但我对 SQL 数据库的理解充其量只是粗制滥造。我正在创建一个网站(主要用于学习目的),允许用户发布不同类型的帖子(图像/视频/文本/链接)。

这是我存储的基础知识

  1. 自动- int(键索引)
  2. 用户 ID - varchar
  3. 帖子 ID - varchar
  4. 帖子类型- varchar(YouTube、vimeo、图像、文本、链接)
  5. 文件名- varchar(原始图像名称或链接标题)
  6. 来源- varchar(外部链接或文件名 + ext)
  7. 标题- varchar(用户选择的帖子标题)
  8. 消息-文本(用户的实际帖子)
  9. 日期- int(unix 时间戳)

我在其他表格中存储了与帖子相关的其他数据,我使用帖子 ID(如用户信息)获取这些数据,但我真的怀疑这是否是我应该存储信息的方法。我确实使用 PDO,但我恐怕这种格式可能会非常慢。

以另一种格式存储帖子信息是否有任何意义?我不想要过大的表,所以从性能的角度来看,我应该将一些信息存储为 blob/binary/xml/json 吗?

我似乎找不到任何关于 PHP/MySQL 优化的好资源。我遇到的大多数信息往往是 5 到 10 年前的内容,需要付费的内容,太低级,或者只是简单的文档,无法吸引我超过半小时的注意力。

4

3 回答 3

3

数据库用于存储“数据”,并且可以快速检索数据。不要切换到其他任何东西,坚持使用数据库。

尽量不要将图片和视频存储在数据库中。将它们存储在磁盘上,并将对它们的引用保存在数据库表中。

最后,赶上数据库规范化,它将帮助您使数据库处于最佳状态。

于 2012-09-06T07:36:30.657 回答
1

您所拥有的似乎还不错,但是您错过了有关索引和键的重要信息。

首先,我假设您的主键将是字段 1。好的,那里没有问题,但请确保您还在 userID、PostID、Date 上粘贴了一个索引,并且可能在 UserID、Date 上粘贴了一个复合索引。

其次,您是否打算在这些上具有搜索功能?在这种情况下,您可能需要启用全文搜索。

不要试图将数据存储在 JSON 或其他类似的东西中。存储它简单明了。您要做的最后一件事是尝试从数据库中提取一个字段以查看其中的内容。如果您的数据库无法解决,那就是糟糕的设计。

在这方面,大桌子没有任何问题。只要它们被很好地索引,一个小表或大表在访问它方面几乎没有什么区别(没有大量写得不好的 SQL 连接),所以要担心能够从中获取数据的简单性。

编辑:主键是通过某种唯一列识别行的可爱方法。因此,如果您想删除一行,在您的示例中,您可以指定 adelete from yourTable where ID=6并且您知道这只会删除一行,因为只有一行的 ID=6。

另一方面,索引与键不同,因为它就像一个备忘单,让数据库知道某些信息在表中的位置。例如,如果您在 UserID 列上有一个索引,当您在查询中传递一个 userID 时,数据库不必查看整个表,它会查看索引并知道该索引所有行的位置用户。

复合索引又向前迈进了一步,如果您知道要不断查询 UserID 和 ContentType 数据的内容,则可以添加复合索引(意味着一个索引中的两个字段上的索引),然后将允许数据库仅返回您在使用这两个列的查询中指定的数据,而无需筛选整个表 - 甚至无需筛选所有用户帖子以找到正确的内容类型。

现在,索引在服务器上占用了一些额外的空间,所以请记住这一点,但是如果您的表变得更大(这非常好),那么提高的效率是惊人的。

于 2012-09-06T07:36:48.190 回答
1

此时,暂时坚持使用 RDMS。一旦你对 PHP 和 MySQL 感到满意,那么以后可能会有更多的东西需要学习,比如 NoSQL、MongoDB 等。但就你目前的目的而言,因为每件事都有其目的,这是完全正确的,不会减慢速度。您的表架构似乎正确,几乎没有修改。

用户 id 和 Post id 将是整数,我认为这个表是 post 所以 post id 将自动递增,它将是主键。

另一件事是您使用 2 个字段,文件名和源,请注意,文件名将是上传的文件名,但如果源是指文件的完整路径,那么 DB 不是存储完整路径的地方。从 PHP 函数生成路径。每次不在数据库中访问该路径。否则,如果您需要更改路径,那么开销会很大。

您还询问了 blob 等问题。请注意,最好将文件存储在文件系统中而不是 db 中,而当想要将文件存储在 DB 表中时,像 blob 等这些字段很好,我不推荐在这里。

于 2012-09-06T07:47:07.157 回答