MySQL: Many tables or many databases?

前端 未结 9 497
陌清茗
陌清茗 2020-11-30 20:40

For a project we having a bunch of data that always have the same structure and is not linked together. There are two approaches to save the data:

  • Creating a n
相关标签:
9条回答
  • 2020-11-30 21:02

    Why not create a single table to keep track of your pools (with a PoolID and PoolName as you columns, and whatever else you want to track) and then on your 15-25 tables you would add a column on all of them which would be a foreign key back to you pool table so you know which pool that particular record belongs to.

    If you don't want to mix the data like that, I would suggest making multiple databases. Creating multiple tables all for the same functionality makes my spider sense tingle.

    0 讨论(0)
  • 2020-11-30 21:03

    There should be no significant performance difference between multiple tables in a single database versus multiple tables in separate databases.

    In MySQL, databases (standard SQL uses the term "schema" for this) serve chiefly as a namespace for tables. A database has only a few attributes, e.g. the default character set and collation. And that usage of GRANT makes it convenient to control access privileges per database, but that has nothing to do with performance.

    You can access tables in any database from a single connection (provided they are managed by the same instance of MySQL Server). You just have to qualify the table name:

    SELECT * FROM database17.accounts_table;
    

    This is purely a syntactical difference. It should have no effect on performance.

    Regarding storage, you can't organize tables into a file-per-database as @Chris speculates. With the MyISAM storage engine, you always have a file per table. With the InnoDB storage engine, you either have a single set of storage files that amalgamate all tables, or else you have a file per table (this is configured for the whole MySQL server, not per database). In either case, there's no performance advantage or disadvantage to creating the tables in a single database versus many databases.

    There aren't many MySQL configuration parameters that work per database. Most parameters that affect server performance are server-wide in scope.

    Regarding backups, you can specify a subset of tables as arguments to the mysqldump command. It may be more convenient to back up logical sets of tables per database, without having to name all the tables on the command-line. But it should make no difference to performance, only convenience for you as you enter the backup command.

    0 讨论(0)
  • 2020-11-30 21:03

    Given the restrictions you've placed on it, I'd rather spin up more tables in the existing database, rather than having to connect to multiple databases. Managing connection strings TEND to be harder, in addition to managing the different database optimizations you may have.

    0 讨论(0)
  • 2020-11-30 21:11

    I'm not too sure I completely understand your scenario. Do you want to have all the pools using the same tables, but just differing by a distinguishing key? Or do you want separate pools of tables within the one database, with a suffix on each table to distinguish the pools?

    Either way though, you should have multiple databases for two major reasons. The first being if you have to change the schema on one pool, it won't affect the others.

    The second, if your load goes up (or for any other reason), you may want to move the pools onto separate physical machines with new database servers.

    Also, security access to a database server can be more tightly locked down.

    All of these things can still be accomplished without requiring separate databases - but the separation will make all of this easier and reduce the complexity of having to mentally track which tables you want to operate on.

    0 讨论(0)
  • 2020-11-30 21:13

    Differing the pools by table name or putting them in separate databases is about the same thing. However, if you have lots of tables in one database, MySQL has to load the table information and do a security check on all those tables when logging in/connecting.

    As others mentioned, separate databases will allow you to shift things around and create optimizations specific to a certain pool (i.e. compressed tables). It is extra admin overhead, but there is considerably more flexibility.

    Additionally, you can always "pool" the tables that are in separate databases by using federated or merge tables to simplify querying if needed.

    As for running out of primary keys, you could always use a compound primary key if you are using MyISAM tables. For example, if you have a field called groupCode (any type) and another called sequenceId (auto increment) and create your primary key as groupCode+sequenceId. The sequenceId will increment based on the next unique ID within the group code set. For example: AAA 1 AAA 2 BBB 1 AAA 3 CCC 1 AAA 4 BBB 2 ...

    Although with large tables you have to be careful about caching and make sure the file system you are using handles large files.

    0 讨论(0)
  • 2020-11-30 21:13

    FTR, in normal circumstances I'd take the approach described by TheTXI.

    In answer to your specific question though, I have found it to be dependant on usage. (Cop out I know, but hear me out.)

    A single database is probably easier. You'll have to worry about just one connection and would still have to specify tables. Multiple databases could, under certain conditions, be faster though.

    If I were you I'd try both. There's no way we'll be able to give you a useful answer.

    0 讨论(0)
提交回复
热议问题