为什么不可以用 SELECT * FROM TABLE?
大家好,我是IT修真院成都分院第13期java学员。
今天给大家分享一下关于mysql查询语句SELECT * 的相关知识。
1.背景介绍
MySQL数据库简介:
1、MySQL是一个关系型数据库,关联的数据保存在不同的表中,增加了数据操作的灵活性。由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点许多中小型网站为了降低网站总体拥有成本而选择了MySQL作为网站数据库。MySQL工作模式是基于客户机/服务器结构。目前它可以支持几乎所有的操作系统,同时也可以和php完美结合。简单的来说,MySql是一个开放的、快速的、多线程的、多用户的SQL数据库服务器。
2、select * from table是mysql中用来查询某张表的所有字段的sql语句;
3、我们大概都知道这样写不是那么的高效,没有针对性。
2.知识剖析
2.1 Mysql语句执行的原理
第一步:应用程序把查询SQL语句发给服务器端执行。
第二步:服务器解析请求的SQL语句。
第三步:语句执行。
sql语句执行流程原理图:
2.2 select * from table 的缺点
1、mysql拿到一条命令,会去解析命令、优化查询,然后去存储引擎执行查找.SELECT * 语句取出表中的所有字段,会解析更多的 对象,字段,权限,属性相关,不论该字段的数据对调用的应用程序是否有用,这会对服务器资源造成浪费,导致优化和效率问题,对服务器的性能产生一定的影响。
2、如果表的结构在以后发生了改变,那么SELECT * 语句可能会取到不正确的数据甚至是出错。
3、执行SELECT * 语句时,select * 语句要对表中所有列进行权限检查,这部分也是开销
4、使用SELECT * 语句将不会使用到覆盖索引,不利于查询的性能优化.(索引覆盖:索引覆盖是一种速度极快,效率极高,业界推荐的一种查询方式.就是select的数据列只用从索引中就能够获得,不必从数据表中读取,也就是查询列要被所使用的索引覆盖)
5、在文档角度来看,SELECT * 语句没有说明将要取出哪些字段进行操作,不具备针对性,不推荐。
6、用 select * 语句插入一个表,以后表结构修改了,如增加或删除了一列,对代码影响很大,如果只是恰好只获取自己需要的那几列,表结构的修改对你的代码影响就会比较小,便于后期项目维护。
从上面几点来看,对于经常和数据库打交道的我们来说确实应该用select 字段名 来进行查询。
3.常见问题
4.解决方案
5.编码实战
表 user含有100万条数据,6个字段名
select * from user limit 0,100000
select uid,id,name,age,create_time,update_time from user limit 100000,100000
我用的spring-aop获取时间,看下效率差别。
用批量插入100万条数据:
mapper.xml
<select id="select01" resultType="com.userInfo.User">
select * from user limit 0,100000
</select>
<select id="select02" resultType="com.userInfo.User">
select uid,id,name,age,create_time,update_time
from user limit 100000,100000
</select>
Aopclass切面类