从 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 获取数据的更有效方法的主要内容,如果未能解决你的问题,请参考以下文章
从一个非常大的 MySQL 转储文件中以 csv 格式获取数据