查询SELECT * 弊端分析

小课堂

分享人:杜腾飞

1.背景介绍

2.知识剖析

3.常见问题

4.解决方案

5.编码实战

6.扩展思考

7.参考文献

8.更多讨论

1.背景介绍

先介绍下背景

“数据库” ---起源于 20 世经 90 年代,当时美国为了战争的需要,把各种情报收集在一起,存储隐藏在计算机内,叫做 Data Base(DB)现在,一切活动都离不开数据。

“SQL” ----是用于访问和处理数据库的标准的计算机语言,简称结构化查询语言

“SELECT 语句”----用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。

2.知识剖析

Mysql执行查询的原理

客户端发送一条查询给服务器

服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段;

服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划;

MySql根据优化器生成的执行计划,调用存储引擎的API执行查询;

返回结果给客户端

3.常见问题

select * 为什么会降低查询效率?

获取数据&传输结果

分析原因

1,数据库需要知道*等于什么,查数据字典(进行数据库设计的时候,对数据库元素进行的解释说明),这在分析阶段就会增大开销。

2,select *最大的问题是可能会多出一些不用的列,这就杜绝了索引覆盖的可能性,导致查询的成本几何级增高(索引覆盖:就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。)

3,网络开销,不需要的字段会增加数据传输的时间,在本地客户端连的是本地mysql服务器,TCP协议传输数据会增加额外的时间;数据量越大这种这种劣势就会越明显;如果db和客户端不在同一台机器,那这种开销就更加明显

4,mysql拿到一条命令,会去解析命令、优化查询,然后去存储引擎执行查找, Select*数据库会解析更多的 对象,字段,权限,属性相关,在 SQL 语句复杂,会对数据库造成沉重的负担。

5,从另外一个角度来看;当查询进行的时候,多取了不必要的列,数据字段比较多,mysql并不是把所有结果全部得到后再进行一次性保存,而是每次分配一块大小的内存空间保存结果集,使用完后,接着再分配一个这样的块,如果还不不够,接着再分配一个块,依此类推,也就是说,有可能在一次查询中mysqI要进行多次内存分配的操作,频繁操作内存都是要耗费时间的。

6,原则上讲作为有着良好编程习惯的程序员,也不应该获取自己不需要的东西,若是执行select*,以后表结构修改了,如原表加减了某些列,对代码影响也很大。

7,当然,若是你想在select出所有的column时,倒是一个方便的方法,毫无疑问!

4.解决方案

NO;优秀的程序猿,不会获取自己不需要的东西。

5.编码实战

navicat for mysql

查看时间论证结论

6.扩展思考

缓存机制

7.参考文献

1,http://www.cnblogs.com/xinye/p/3823461.html https://www.zhihu.com/question/37777220

2,http://www.cnblogs.com/xinye/p/3823461.html

3,http://bbs.csdn.net/topics/390302591?page=1#post-393091122

4,http://blog.csdn.net/wujizkm/article/details/50497642

5,http://blog.csdn.net/beauty_1991/article/details/51160072

6,http://blog.csdn.net/li563868273/article/details/51254907

8.更多讨论

唯一索引

Thanks

By : Bigdudada