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