Mysql 拆分数据库表以获得性能?

Mysql 拆分数据库表以获得性能?,mysql,sql,Mysql,Sql,我有一个很大的“用户”表,其中大多数列(用户配置文件)只是偶尔需要,而少数列(用户凭据)经常需要。我不想仅仅为了显示用户名而获取整个配置文件行 将表一分为二(即用户和配置文件)会提高性能,还是会降低性能(必须对配置文件进行两次查询)?在MySql中,只获取几列的行与获取一百列的行之间是否存在性能差异 多谢各位 我应该提到的是,我在Laravel框架上。我必须使用原始查询来选择列。我不喜欢这个想法,但我会研究一下。在SQL开发中有一个古老的习惯用法,它指出当您实际执行SELECT*时,您确实不希望

我有一个很大的“用户”表,其中大多数列(用户配置文件)只是偶尔需要,而少数列(用户凭据)经常需要。我不想仅仅为了显示用户名而获取整个配置文件行

将表一分为二(即用户和配置文件)会提高性能,还是会降低性能(必须对配置文件进行两次查询)?在MySql中,只获取几列的行与获取一百列的行之间是否存在性能差异

多谢各位


我应该提到的是,我在Laravel框架上。我必须使用原始查询来选择列。我不喜欢这个想法,但我会研究一下。

在SQL开发中有一个古老的习惯用法,它指出当您实际执行
SELECT*
时,您确实不希望表中的所有内容都

要加快查询速度并提高性能,您可以做以下几件事:

1) 仅选择SQL语句所需的字段,例如:

SELECT `username`, `password`, `email` FROM `users` WHERE `id` = 1
2) 向表中添加索引,以便可以优化经常使用的任何查询。例如,如果你定期查看用户的电子邮件地址,你可以考虑添加一个索引到<代码>电子邮件列。p> 你可能也想调查一下,但我认为这不是你真正需要的。MySQL被设计成一个可以保存数百万条记录的数据库


您还应该记住,在设计数据库时,至少执行以下三个步骤是至关重要的。这确保了数据的完整性,也优化了项目的数据库结构。

阅读本文,它解释了很多。

我有一个很大的“用户”表

定义“大”

在表上定义适当的索引应该很简单,这样所有访问都是顺序日志(n)(其中n是行数),而在没有索引的情况下,访问是O(n)。这意味着,在dex中没有suitbale的情况下检索行所需的工作量(以及所花费的时间)随着行数的增加而线性增加,但随着索引的增加,它会随着行数的记录而增加。还需要考虑很多其他因素来获取一个行所需的实际时间。添加更多表会增加成本,但一般来说,加速访问的第一个端口是添加适合于应用于数据的查询的索引(或索引)。这意味着要查看解释计划以及表和索引结构

当数据库必须从磁盘读取然后丢弃数据时(对于完整表扫描或索引不足),它仍然会将数据存储在内存中—替换可能有用的数据—在某些情况下,完整表扫描可能是最有效的解决方案—但会有效地刷新大部分I/O缓存。如果没有覆盖索引,则必须将与计划匹配的每一行的全部内容读入内存。通常这是一个昂贵的位-但是通过对这样一个表使用“SELECT*”,可以保证没有覆盖索引,并且在客户端传输和保存数据时会有更多的成本

接下来,考虑数据变化的频率。如果您有可变长度的列(varchar、CLOB等),那么对行的更新可能会导致新版本比旧版本大-导致行链接/迁移:单个记录的数据可能会在磁盘上分布得更远,从而导致检索行所需的更多搜索

因此,如果在检查是否有非常有效的索引之后,仍然需要提高性能,那么将表中的列拆分为2个或更多新表可能会带来优势

在单个DB实例上将行拆分为单独的表不太可能带来显著的性能改进(但在有多个数据库或有时有多个磁盘的情况下,这是一种可行的策略)


您既没有提供表/索引的结构,也没有提供查询的解释计划,因此不可能对如何提高性能提出明确的建议。即使有了这些信息,也无法替代尝试不同的模型和测量整个系统的性能。

为什么不在SELECT查询中只获取所需的列?我不希望仅为了显示用户名而获取配置文件中的整行。你不必这么做。只需指定要选择的字段:
从username='myuser'的用户中选择name,姓氏
我认为这取决于您的RAM,当整个表不适合RAM时,理想的索引与分区结合不会有什么不同,如果有很多或很少的专栏,请仔细阅读您询问的是select*vs select吗?或者你担心列数?最好在回答的同时添加一个解释,而不仅仅是提供一个链接。如果链接更改或被删除,您的答案将变得无用。那么我可能应该将用户数据保存在一个表中,并在Laravel中找到一种方法来动态获取所需的列。