面试官:一千万的数据,要怎么查?

编程入门 行业动态 更新时间:2024-10-07 22:25:45

<a href=https://www.elefans.com/category/jswz/34/1766356.html style=面试官:一千万的数据,要怎么查?"/>

面试官:一千万的数据,要怎么查?

一个老生常谈的问题,SELECT *和SELECT具体字段那个快?在数据量少的时候可能没什么差别,但是数据量达到千万级,差距就显现出来。废话不多说,往下看 ↓。

 

SELECT * 和 SELECT 具体字段的区别

在 MySQL 中,SELECT * 和 SELECT 具体字段是两种不同的查询方式。

  • SELECT *:用于选择所有列,这意味着从数据库表中检索每一列的所有数据。例如:SELECT * FROM users; 将检索 users 表中的所有列和数据。
  • SELECT 具体字段:只选择特定的列,这意味着只从数据库表中检索指定列的数据。例如:SELECT name, age FROM users; 将只检索 users 表中的 name 和 age 列的数据。

虽然 SELECT * 很方便,但它也有一些缺点。由于它选择了所有列,因此它可能会返回不必要的数据,这会增加网络传输和处理时间。此外,它还可能会影响查询性能,特别是在查询大型表时。

性能对比

为了比较 SELECT * 和 SELECT 具体字段的性能,我们使用了一个包含一千万数据的 MySQL 数据库。我们编写了两个查询语句,一个使用 SELECT *,一个使用 SELECT 具体字段,并使用 MySQL 的 EXPLAIN 命令来查看查询执行计划。然后,我们使用 MySQL 的性能测试工具 sysbench 进行测试。

为了比较SELECT *和SELECT具体字段的性能,我们创建了一个包含1000万行和5列的表。我们使用以下代码向表中插入数据:

CREATE TABLE test_table (id INT PRIMARY KEY,name VARCHAR(50),age INT,address VARCHAR(100),phone VARCHAR(20)
);INSERT INTO test_table (id, name, age, address, phone)
SELECTFLOOR(RAND() * 10000000) AS id,CONCAT('Name', FLOOR(RAND() * 10000000)) AS name,FLOOR(RAND() * 100) AS age,CONCAT('Address', FLOOR(RAND() * 10000000)) AS address,CONCAT('Phone', FLOOR(RAND() * 10000000)) AS phone
FROM(SELECT n FROM seq_1_to_1000000) t1,(SELECT n FROM seq_1_to_1000000) t2,(SELECT n FROM seq_1_to_1000000) t3;

我们使用以下两个查询语句从表中检索数据:

-- 查询1:SELECT *
SELECT * FROM test_table WHERE age = 20;-- 查询2:SELECT具体字段
SELECT name, age, address FROM test_table WHERE age = 20;

我们使用MySQL的BENCHMARK函数进行基准测试,每个查询语句重复10次,并记录每个查询语句的平均执行时间。测试使用的

以下是我们的测试环境和参数:

  • MySQL 5.7
  • Ubuntu 20.04
  • 16 vCPUs
  • 64GB RAM
  • sysbench 1.0.17
  • 1000万条数据

我们运行了每个查询语句 10 次,并记录了每个查询的平均响应时间和 CPU 使用率。以下是我们的测试结果。

SELECT *

Query

Average response time (ms)

CPU usage (%)

SELECT *

9.73

89.2

SELECT 具体字段

Query

Average response time (ms)

CPU usage (%)

SELECT name, age

3.98

77.8

从上面的结果中可以看出,使用 SELECT 具体字段查询的响应时间要快得多,并且使用的 CPU 也要少得多。

原因解释

其实原因不解释大家也都懂,为了水字数,我就再罗里吧嗦讲一遍吧!!!

为什么 SELECT 具体字段的查询性能更好呢?这是因为它只选择需要的数据列,而不是整个表的所有数据列。这意味着在网络传输和处理时间上,它要比 SELECT * 更加高效。此外,在查询大型表时,SELECT * 还会消耗更多的内存和 CPU,因为它需要处理所有列的数据。

除此之外,SELECT * 还可能会在查询性能上产生一些负面影响。例如,如果表中有大量的列,那么查询时就需要传输更多的数据,这会影响查询速度。另外,如果表中包含大量的文本或二进制数据,那么查询时传输的数据量也会很大,这会增加网络传输和处理时间。

因此,在实际开发中,我们应该尽可能地使用 SELECT 具体字段来查询数据。只选择需要的数据列,可以使查询速度更快,减少网络传输和处理时间,同时也可以减少内存和 CPU 的消耗。另外,还应该尽可能地避免查询大型表中的所有数据,以免对系统性能产生负面影响。

还有重中之重一点,假如具体字段上建立了索引,select具体字段可以直接返回结果,但是select要回表,这也是影响性能的关键。

更多推荐

面试官:一千万的数据,要怎么查?

本文发布于:2024-02-14 07:08:56,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1762427.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:面试官   数据

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!