一起养成写作习惯!这是我参与「掘金日新计划 · 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 好一些
- 字段多,不需要的字段会增加数据传输使劲和网络开销。
mysql 读取字段,有的需要一些硬编码,加大mysql 负担,数据传输量大,同时加大了了网络负担。
- 对于大字段,如 varchar、blob、text,会增加 io 操作
大字段,mysql 存储,会存储在其他地方,会增加一次 MySQL io操作
- 如果存在覆盖索引,
select *走不了“覆盖索引”的策略优化SELECT *会完美避开覆盖索引的优化,然而覆盖索引是可以极大的提高效查询效率的。
覆盖索引 case1 :
有一种索引,叫做覆盖索引,为了避免回表查询,通常使用覆盖索引。
比如有一个常用查询,只需要用到表中的某两列,user_id和post_id,而且有一个多列索引已经覆盖了这两个列,那么这个索引就是这个查询的覆盖索引了。
如果select user_id,post_id from Table 的话,mysql是可以不用读data,直接使用index里面的值就返回结果的.
但是一旦用了select*,就会有其他列需要读取,这时在读完index以后还需要去读data才会返回结果。这两种处理方式性能差异非常大,特别是返回行数比较多,并且读数据需要IO的时候,可能会有几十上百倍的差异。
查看执行计划 explain 也可以看到, sql 1 这个方式,走索引,Extra信息 内容是 Using index ,select * 内容是是 Using where。