Mysql速度:具有多个列的表或使用联接的两个表

时间:2018-07-09 08:37:11

标签: php mysql performance

我尝试搜索此内容,但除了设计选择之外,找不到任何其他内容。

所以我的问题就像标题一样。什么更快?创建具有多个列的1个表,或创建具有连接的2或3个(多对多)表。

我喜欢具有多个表的想法,因此数据是分开的。大多数情况下,对于许多喜欢的数据。但是我的朋友告诉我,用布尔值创建5列就可以了。但是我喜欢这样的想法:有一个带有设置的表,然后是一个位于user.id和setting.id之间的表。但是我的问题还在于,它对查询有影响吗?

示例:

Users
- id
- Email
- SettingA
- SettingB
- SettingC

OR示例:

Uers
- id
- email
Users_Settings
- user_id
- setting_id
Settings
- id
- someSettingsValue

Mysql查询数据会更快些吗? (为用户检索设置)

2 个答案:

答案 0 :(得分:0)

一点也不..与单个表字段相比,仅2 r 3之间的连接将花费时间。

答案 1 :(得分:0)

这不是要选择具有多个列的单个表还是要选择多个表。是关于归一化的。

根据您提供的模式,如果所有用户始终具有三个设置,即设置A,B和C,则最好使用这三列作为设置来创建单个表。

users table:
    +----------+--------------+------+-----+---------+----------------+
    | Field    | Type         | Null | Key | Default | Extra          |
    +----------+--------------+------+-----+---------+----------------+
    | id       | int(11)      | NO   | PRI | NULL    | auto_increment |
    | Email    | varchar(128) | NO   |     | NULL    |                |
    | SettingA | tinyint(1)   | NO   |     | NULL    |                |
    | SettingB | tinyint(1)   | NO   |     | NULL    |                |
    | SettingC | tinyint(1)   | NO   |     | NULL    |                |
    +----------+--------------+------+-----+---------+----------------+

但是,如果保存的任何设置为null,那么最好是为该设置创建一个单独的表,然后再创建一个数据透视表以保持用户的设置而无需主键。

users table:
    +-------+--------------+------+-----+---------+----------------+
    | Field | Type         | Null | Key | Default | Extra          |
    +-------+--------------+------+-----+---------+----------------+
    | id    | int(11)      | NO   | PRI | NULL    | auto_increment |
    | Email | varchar(128) | NO   |     | NULL    |                |
    +-------+--------------+------+-----+---------+----------------+

settings table:
    +---------------+------------+------+-----+---------+----------------+
    | Field         | Type       | Null | Key | Default | Extra          |
    +---------------+------------+------+-----+---------+----------------+
    | id            | int(11)    | NO   | PRI | NULL    | auto_increment |
    | setting_value | tinyint(1) | NO   |     | NULL    |                |
    +---------------+------------+------+-----+---------+----------------+

setting_user pivot table:
    +------------+---------+------+-----+---------+-------+
    | Field      | Type    | Null | Key | Default | Extra |
    +------------+---------+------+-----+---------+-------+
    | setting_id | int(11) | NO   |     | NULL    |       |
    | user_id    | int(11) | NO   |     | NULL    |       |
    +------------+---------+------+-----+---------+-------+

其中setting_user是数据透视表。

在创建模式时,还要考虑一件事,即在扩展应用程序时,总会有三个设置,或者将来还会有更多设置!