从 MySQL 获取数据的更有效方法

Posted

技术标签:

【中文标题】从 MySQL 获取数据的更有效方法【英文标题】:More efficient way to fetch data from MySQL 【发布时间】:2015-01-25 13:07:07 【问题描述】:

假设我有一个名为 "User"mysql 表。

ID、姓名、电子邮件、年龄、性别、国家、家乡、城市、地址、Relationship_Status、Employment_Status、IP、Registered_Time

现在,哪个查询更有效地获取用户的所有信息?

一)

SELECT * FROM User WHERE id=1

B)

从用户那里选择 ID,其中 id=1

SELECT Name FROM User WHERE id=1

从 id=1 的用户中选择电子邮件

从 ID=1 的用户中选择年龄

SELECT Gender FROM User WHERE id=1

SELECT Country FROM User WHERE id=1

从 ID=1 的用户中选择家乡

从 ID=1 的用户中选择城市

从用户那里选择地址,其中 id=1

SELECT Relationship_Status FROM User WHERE id=1

从用户 WHERE id=1 中选择就业状态

从 ID=1 的用户中选择 IP

SELECT Registered_Time FROM User WHERE id=1

问题是,视情况而定,我可能需要也可能不需要所有数据。那么,我是应该在需要时一个一个地获取每个数据,还是应该一次获取所有数据,然后按需使用?

感谢您的帮助!

【问题讨论】:

dba.stackexchange.com/questions/76973/… 除非你有大量的列,否则任何查询的慢速部分都是去获取行。必须复制回客户端的列数是微不足道的。 【参考方案1】:

获取多个列的单个查询几乎总是比多个查询更有效。为什么?查询必须由php序列化,发送到mySQL服务器,反序列化。然后 mySQL 服务器必须执行WHERE 操作来找到合适的行。最后它必须序列化结果并将它们发送回 php。你做的越少,系统要做的工作就越少。

专业提示:不要使用 SELECT * 。而是枚举你想要的列,就像这样。

SELECT ID, Name, Email, Employment_Status, Registered_Time FROM Users WHERE ID = 1

这种方法有很多优点,尤其是在返回许多行的查询中(你的没有)。

【讨论】:

奥利琼斯的回答没有回答这个问题。 Ollie 谈论的是单个查询获取多行的效率,而最初的问题是关于获取多列的。然后 Ollie 谈到枚举多列而不是使用 *,这也是一个不同的话题。 糟糕,我的意思是写“多列”,抱歉。固定。【参考方案2】:

对数据库的每次查询都需要花费一些成本。 PHP 必须将查询发送到 SQL 服务器,查询分析器必须解析您的查询,对其进行优化,将其转换为一些内部代码,查找表,在磁盘上的索引文件中查找,在磁盘上的数据文件中查找.

使用 SELECT * 一次选择所有列的成本几乎与在一个 sql 查询中单独选择单个列的成本相同。

当从磁盘上的文件中读取数据时,它不会只读取您需要的 10 个字节,操作系统总是以更大的块读取磁盘中的数据(例如 4KB,这可能取决于)。

在绝大多数情况下,选择像“SELECT Age ...”这样的一列将从磁盘读取整行。

因此,为了回答您的问题,您的示例中的 SELECT * 会更有效,因为您将经历一次解析查询的开销。

【讨论】:

以上是关于从 MySQL 获取数据的更有效方法的主要内容,如果未能解决你的问题,请参考以下文章

获取每个坐标的对角线长度的更有效方法

检索 Firebase 数据的更有效方法?

从一个非常大的 MySQL 转储文件中以 csv 格式获取数据

从具有特定根的 SQL 表中获取最新分支的最有效方法是啥?

使用犰狳做 `Q.slice(a).col(b)` 的更有效方法

从附加元素获取 jQuery 对象的更简单方法