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

一个老生常谈的问题,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)
SELECT
   FLOOR(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要回表,这也是影响性能的关键。

猜你喜欢

转载自blog.csdn.net/Dark_orange/article/details/131550568