我正在尝试优化我的PHP和MySQL,但我对SQL数据库的理解充其量是劣质的。我正在创建一个网站(主要用于学习目的),允许用户制作不同类型的帖子(图像/视频/文本/链接)。
以下是我存储的基本知识
我在其他表格中存储了与帖子相关的其他数据,我用post id抓取(如用户信息),但我真的怀疑这是否是我应该存储信息的方法。我确实使用PDO,但我担心这种格式可能会非常慢。
将帖子信息以其他格式存储会有任何意义吗?我不想要过大的表,所以从性能的角度来看,我应该将一些信息存储为blob / binary / xml / json吗?
我似乎无法在PHP / MySQL优化上找到任何好的资源。我遇到的大多数信息往往是5到10年,你需要支付的内容,太低级别,或只是直接的文档,不能引起我的注意超过半小时。
答案 0 :(得分:3)
数据库用于存储“数据”,并且可以快速检索数据。不要切换到其他任何东西,坚持使用数据库。
尽量不要将图片和视频存储在数据库中。将它们存储在磁盘上,并在数据库表中保留对它们的引用。
最后,赶上数据库normalization,它将帮助您使数据库处于最佳状态。
答案 1 :(得分:1)
你有什么似乎没问题,但你错过了关于索引和键的重要部分。
首先,我假设您的主键是字段1.好的,没有问题,但请确保您还在userID,PostID,Date上粘贴索引,并且可能是UserID上的复合,日期。
其次,你打算在这些上有搜索功能吗?在这种情况下,您可能需要启用全文搜索。
不要试图将数据存储在JSON或其他类似的东西中。存储简单明了。你要做的最后一件事是尝试从数据库中提取一个字段,看看里面是什么。如果你的数据库无法解决,那就很糟糕了。
就此而言,没有任何错误的与大表。只要它们被很好地编入索引,一个小表或大表在访问它时就会产生很小的差异(没有写得很糟糕的SQL连接),所以担心简单就能获取从中回来的数据。
编辑:主键是通过某种唯一列标识行的可爱方法。因此,如果要删除行,在您的示例中,您可以指定delete from yourTable where ID=6
,并且您知道这只会删除一个行,因为只有一行可以具有ID = 6。
另一方面,索引与键不同,因为它就像数据库中的作弊表,知道表中某些信息的位置。例如,如果在UserID列上有索引,则在查询中传递userID时,数据库不必查看整个表,它会查看索引并知道所有行的位置。用户。
复合索引又向前迈出了一步,如果你知道你想要不断查询UserID和ContentType的数据,你可以添加一个复合索引(意味着一个索引中的BOTH字段的索引)然后,将允许数据库仅使用这两列返回您在查询中指定的数据,而无需筛选整个表 - 甚至不会筛选所有用户帖子以找到正确的内容类型。
现在,索引在服务器上占用了一些额外的空间,所以请记住这一点,但如果你的表变得更大(这完全没问题),效率的提高是惊人的。
答案 2 :(得分:1)
目前,坚持使用RDMS。一旦你对PHP和MySQL感到满意,那么稍后可能会有更多的东西要学习,比如NoSQL,MongoDB等,但是对于你的当前目的,因为每件事都有它的目的,这是非常正确的,不会放慢速度。您的表架构似乎没有什么修改。
用户ID和帖子ID将是整数,我认为此表是post,因此post id将自动递增,并且它将是主键。
其他的是你使用2个字段,文件名和来源,请注意文件名将是上传的文件名,但是如果按来源表示文件的完整路径,那么DB不是存储完整路径的地方。从PHP函数生成路径。每次不在DB中访问该路径。否则,如果您需要更改路径,那么将会产生很大的开销。
你也问过blob等。请注意最好将文件存储在文件系统而不是db中,而像blob等这些字段在将数据存储到数据库表时是好的,我不建议这里