select * 与 select xxx,xxx 性能问题

186 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第12天,点击查看活动详情

select * 与 select xxx,xxx 性能问题

SQL

sql 1:

SELECT * FROM TABLE

sql 2:

SELECT column1, colum2, column3, etc. FROM TABLE

为啥说 sql 2 比 sql 1 好一些

  1. 字段多,不需要的字段会增加数据传输使劲和网络开销。

mysql 读取字段,有的需要一些硬编码,加大mysql 负担,数据传输量大,同时加大了了网络负担。

  1. 对于大字段,如 varchar、blob、text,会增加 io 操作

大字段,mysql 存储,会存储在其他地方,会增加一次 MySQL io操作

  1. 如果存在覆盖索引,select *走不了“覆盖索引”的策略优化 SELECT * 会完美避开覆盖索引的优化,然而覆盖索引是可以极大的提高效查询效率的。

覆盖索引 case1 :

有一种索引,叫做覆盖索引,为了避免回表查询,通常使用覆盖索引。 比如有一个常用查询,只需要用到表中的某两列,user_idpost_id,而且有一个多列索引已经覆盖了这两个列,那么这个索引就是这个查询的覆盖索引了。

如果select user_id,post_id from Table 的话,mysql是可以不用读data,直接使用index里面的值就返回结果的. 但是一旦用了select*,就会有其他列需要读取,这时在读完index以后还需要去读data才会返回结果。这两种处理方式性能差异非常大,特别是返回行数比较多,并且读数据需要IO的时候,可能会有几十上百倍的差异。

查看执行计划 explain 也可以看到, sql 1 这个方式,走索引,Extra信息 内容是 Using index ,select * 内容是是 Using where