大家好,我是IT修真院上海分院,一枚正直纯洁善良的如刚入门的Java程序员,今天试着给大家分享一下Select*from table的弊端
sql执行流程机制:
1.客户端发送一条查询给服务器。
2.服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段。
3。服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划
4。MySql根据优化器生成的执行计划,调用存储引擎的API执行查询。
5。返回结果给客户端。
具体用法:
-- 检索单个列
SELECT prod_name FROM products;
-- 检索多个列
SELECT prod_id, prod_name, prod_price FROM products;
-- 检索所有的列
SELECT * FROM products;
-- 检索不同的值
select distinct vend_id from products;
-- 限制结果 (MYSQL)
SELECT prod_name FROM products;
select prod_name from products limit 5;
select prod_name from products limit 3 offset 0; -- 从第0行开始,检索3行
select prod_name from products limit 0, 3; -- 从第0行开始,检索3行
问题分析:
1,数据库需要知道*等于什么,查数据字典(进行数据库设计的时候,对数据库元素进行的解释说明),这在分析阶段就会增大开销(实际上,ORACLE在解析的过程中, 会将’*’ 依次转换成所有的列名, 这个工作是通过查询数据字典完成的, 这意味着将耗费更多的时间)。
2,select *最大的问题是可能会多出一些不用的列,这就杜绝了索引覆盖的可能性,导致查询的成本几何级增高(索引覆盖:就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。)
3,网络开销,不需要的字段会增加数据传输的时间,在本地客户端连的是本地mysql服务器,TCP协议传输数据会增加额外的时间;数据量越大这种这种劣势就会越明显;如果db和客户端不在同一台机器,比如链接到阿里云,那这种开销就更加明显
4,从另外一个相似的角度来看;就是查询进行的时候,多取了不必要的列,数据字段比较多,mysql并不是把所有结果全部得到后再进行一次性保存,而是每次分配一块大小的内存空间保存结果集,使用完后,接着再分配一个这样的块,如果还不不够,接着再分配一个块,依此类推,也就是说,有可能在一次查询中mysqI要进行多次内存分配的操作,频繁操作内存都是要耗费时间的。
5,mysql拿到一条命令,会去解析命令、优化查询,然后去存储引擎执行查找,Select*数据库会解析更多的 对象,字段,权限,属性相关,在 SQL 语句复杂,会对数据库造成沉重的负担。选择了实际不会用到的额外的列,就会导致优化和效率问题。
6,原则上讲作为有着良好编程习惯的程序员,也不应该获取自己不需要的东西,若是执行select*,以后表结构修改了,如原表加减了某些列,对代码影响也很大。(源程序就会报错,因为列数不对应。)
7,当然,若是你想在SELECT子句中列出所有的COLUMN时,使用动态SQL列引用 ‘*’ 倒是是一个方便的方法,毫无疑问!对于一次性的查询来说,使用Select *没有任何问题,不过要避免将它作为应用开发代码的一部分。程序员可能在代码中编写SQL来选择数据,并放入宿主变量字段。使用Select *时,必须为表中的每一列分别写一个宿主变量。倘若表少了一列,或者表中增加了一个新列呢?如果发生这种情况,就需要调整源代码。为了避免这种可能性,首先就不要使用Select *。
索引拓展:
1,唯一索引怎么判断列唯一:先建立唯一索引, MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,MySQL将拒绝插入那条新记录。也就是说,唯一索引可以保证数据记录的唯一性。事实上,在许多场合,人们创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。(唯一索引的异常,时由数据库判断,一次 insert 即可,然后程序捕获异常处理)
最好是判断一下,插入之前先看看有没有相同的记录;当然,不做判断直接插入也是可以的,如果没异常,插入成功;如果捕捉到异常,根据异常的类型,判断有重复记录,做出对应业务处理。(去 SqlServer 官方要编号列表呀。然后你的服务器维护这样一个列表,就可以判断哪种因素的原因了)
2,缓存机制的查看
show variables like "%cache";
show status like "%qcache%";
参考链接:
http://www.cnblogs.com/xinye/p/3823461.html
https://www.zhihu.com/question/37777220
http://bbs.csdn.net/topics/390302591?page=1#post-393091122
http://blog.csdn.net/wujizkm/article/details/50497642
http://blog.csdn.net/beauty_1991/article/details/51160072
http://blog.csdn.net/li563868273/article/details/51254907
今天的分享就到这里啦,刚学没多久,水平不够,欢迎大家指正,拍砖~
我的邀请码:15686104,或者你可以直接点击此链接http://www.jnshu.com/login/1/15686104