Mysql 许多表或行,在SQL中哪一个更有效?
我正在建立一个程序,存储公司的新闻标题及其来自不同来源的时间戳 假设公司的数量是1000。它就像苹果、谷歌、微软。。等等 所以我可以考虑两种选择Mysql 许多表或行,在SQL中哪一个更有效?,mysql,sql,database,schema,relation,Mysql,Sql,Database,Schema,Relation,我正在建立一个程序,存储公司的新闻标题及其来自不同来源的时间戳 假设公司的数量是1000。它就像苹果、谷歌、微软。。等等 所以我可以考虑两种选择 一个包含多行的表(上面的代码只是一个示例) 1000张桌子 CREATE TABLE news_apple // and news_google, news_microsoft, news_...(x 1000) ( news_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY, timestamp
CREATE TABLE news_apple // and news_google, news_microsoft, news_...(x 1000)
(
news_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
timestamp TIMESTAMP NOT NULL,
source TEXT NOT NULL,
content TEXT NOT NULL,
...
)
哪一个在性能方面更有效?为什么?制作一个包含所有公司的表,但使用外键!您可以通过一个数字标识每个公司,并拥有另一个包含每个数字和公司字符串的查找表。比如:
CREATE TABLE news
(
news_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
company_id INT 11,
timestamp TIMESTAMP NOT NULL,
source TEXT NOT NULL,
content TEXT NOT NULL,
...
)
及
使用外键约束使其显式:
通过这种方式,您可以通过重复存储数字而不是字符串来节省空间,您的索引将更小,查找速度也会更快。我在一家拥有6000多个表且不断增长的公司工作,这是管理这些表的困难所在。这样做的好处是减少了表中的行数(我在其他公司有3000万行),这非常好——但前提是您对所有表都有一个可管理的解决方案 例如:6000多个表实际上是带有房间号Id(data_room#u hotelID)的hotel,因此我可以编写存储过程、bash或php脚本来处理它们 另一方面,许多行更简单,因为您需要处理的表更少,但接下来您需要开始创造性地提取数据。您肯定希望在SQLWHERE子句上添加索引,但这是显而易见的 我过去用于管理大型表的选项有: 1) 以一种有意义的方式(如按字母顺序)插入具有自动增量的数据-但是看到您的数据发生了很多变化,这不是一个好的选择 2) 将表加载到内存中-我不知道您在哪里托管这个,但我在内存中使用MySQL。我只知道两种方法:一种是在MySQL上设置,另一种是使用内存驱动器(使用一些计算机的ram),将MySQL及其数据移动到安装的驱动器(我也使用过闪存驱动器) 无论是更频繁地插入还是选择数据,您都需要考虑到这一点 综上所述:
- 如果您选择创建多个表,请确保它们不包含大量数据,并且您可以管理所有表
- 如果使用更少的表和更多的行,请使用索引、RAM驱动器和缓存来加快从大型表中获取数据的过程
那是我的两分钱,希望对你有帮助 关系数据库设计为每个表存储许多行。有一整套机制可以简化大型表,例如:
- 在任何字段组合上建立索引以加快搜索速度
- 页面缓存使常用页面保留在内存中
- 垂直分区(柱状数据库)可进一步加快请求速度
- 高级算法,如哈希连接和分组方式(至少在MySQL以外的数据库中)
- 使用多个处理器和磁盘处理查询
此外,对于多个表,您没有考虑维护所有表和确保不同表中数据正确性的挑战。维护更新需要应用于数千个表,而不是少数表。更多行。这就是关系数据库的设计目的。具有相同结构的多个表通常是设计糟糕的标志。您考虑过基于nosql的解决方案吗?@GordonLinoff,您能给我更详细的解释吗?@rmayer06是的,但这不是一个选项。这一次,我完全同意@GordonLinoff的风格:)。添加更多的行比添加更多的列/表要容易1000倍左右。查询很快就会变成噩梦,试图将类似的表“融合”回主表,就好像它们是同一个表一样。添加列以区分行的类型。感谢您的回复。我知道这些表可以用外键分开,但我想知道上面两个特定选项的性能。这取决于你想做的查询类型。如果您只想查询来自特定新闻源的记录,那么将它们拆分为多个表将执行得更好。但是,如果您想查询所有新闻源中的特定内容,那么拥有一个索引良好的表将执行得更好,因为您不必查询多个表并聚合结果。啊!这就是我要找的。谢谢
CREATE TABLE news
(
news_id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
company_id INT 11,
timestamp TIMESTAMP NOT NULL,
source TEXT NOT NULL,
content TEXT NOT NULL,
...
)
CREATE TABLE companies
(
company_id INT 11
company_name VARCHAR(10)
)