0

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

会将桌子一分为二,即。用户和配置文件的性能更好,还是更糟(必须对配置文件进行两次查询)?在 MySql 中,仅获取几列的行与获取一百列之间是否存在性能差异?

谢谢你。

我应该提到我在 Laravel 框架上。我将不得不使用原始查询来选择列。我不喜欢这个主意,但我会调查一下。

4

3 回答 3

1

SQL 开发中有一个古老的成语,它指出当你真正在做的时候SELECT *,你真的不想要表中的所有东西

您可以采取一些措施来加快查询速度并提高性能:

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

SELECT `username`, `password`, `email` FROM `users` WHERE `id` = 1

2) 为您的表添加索引,以便可以优化任何经常使用的查询。例如,如果您要定期查找用户的电子邮件地址,则可以考虑为该email列添加索引。

您可能还想研究MySQL Partitioning,但我认为这并不是您真正需要的。MySQL 被设计为存储数百万条记录的数据库。

您还应该记住,在设计数据库时,至少执行前三个Normal Forms of Normalization至关重要。这可确保数据完整性,并为您的项目优化数据库结构。

于 2013-10-27T10:46:59.157 回答
0

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

定义“大”。

在表上定义适当的索引应该是微不足道的,这样所有访问都是 log(n) 顺序(其中 n 是行数),而在没有索引的情况下,访问是 O(n)。这意味着在 dex 中没有合适的情况下检索行的努力(以及因此花费的时间)随着行数线性增加 - 但对于索引,它随着行数的对数增加。还有许多其他因素需要考虑以获取检索行所花费的实际时间 - 添加更多表会增加成本,但通常加速访问的第一个调用端口是添加适合查询的索引(或多个索引)应用于数据。这意味着查看解释计划以及表和索引结构。

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

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

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

在单个数据库实例上将行拆分为单独的表不太可能显着提高性能(但在您拥有多个数据库或有时具有多个磁盘的情况下,这是一种可行的策略)。

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

于 2013-10-27T11:29:09.187 回答
0

阅读这篇文章,它解释了很多。 http://bi-bigdata.com/2012/09/02/select-vs-select-in-sql-server-query/

于 2013-10-27T10:49:02.943 回答