Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 许多表或行,在SQL中哪一个更有效?_Mysql_Sql_Database_Schema_Relation - Fatal编程技术网

Mysql 许多表或行,在SQL中哪一个更有效?

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

我正在建立一个程序,存储公司的新闻标题及其来自不同来源的时间戳

假设公司的数量是1000。它就像苹果、谷歌、微软。。等等

所以我可以考虑两种选择

  • 一个包含多行的表(上面的代码只是一个示例)

  • 1000张桌子

    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,
        ...
    )
    
  • 大多数时候,我会为某家公司找到新闻。假设每家公司都有超过10000条新闻。我不知道如果我在第一个选项中使用“WHERE”子句,它会比第二个选项慢


    哪一个在性能方面更有效?为什么?

    制作一个包含所有公司的表,但使用外键!您可以通过一个数字标识每个公司,并拥有另一个包含每个数字和公司字符串的查找表。比如:

    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以外的数据库中)
    • 使用多个处理器和磁盘处理查询
    当把数据放在一个表中时,有一件事更困难,那就是安全性。事实上,在某些情况下,这是一个主要问题,基本上需要将数据放在单独的表中。这些应用非常罕见

    为了举例说明在多个表中存储数据可能有多糟糕,假设在您的系统中,每个公司有一条记录,并将其存储在一个表中。该记录存储有关该公司的信息,如姓名、地址等。呼叫是100字节的信息

    在您的模式中,每个“公司”都有一个单独的表,因此每个表有一行。该记录将驻留在一个数据页上。一个数据页可能是16 KB,因此存储这些数据需要花费大约15.9 KB。存储1000条这样的记录占用16兆字节,而不是大约7页(112千字节)。这可能会对性能造成重大影响


    此外,对于多个表,您没有考虑维护所有表和确保不同表中数据正确性的挑战。维护更新需要应用于数千个表,而不是少数表。

    更多行。这就是关系数据库的设计目的。具有相同结构的多个表通常是设计糟糕的标志。您考虑过基于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)
    )