小课堂
分享人:杜腾飞
1.背景介绍
2.知识剖析
3.常见问题
4.解决方案
5.编码实战
6.扩展思考
7.参考文献
8.更多讨论
先介绍下背景
“数据库” ---起源于 20 世经 90 年代,当时美国为了战争的需要,把各种情报收集在一起,存储隐藏在计算机内,叫做 Data Base(DB)现在,一切活动都离不开数据。
“SQL” ----是用于访问和处理数据库的标准的计算机语言,简称结构化查询语言
“SELECT 语句”----用于从表中选取数据,结果被存储在一个结果表中(称为结果集)。
Mysql执行查询的原理
客户端发送一条查询给服务器
服务器先检查查询缓存,如果命中了缓存,则立刻返回存储在缓存中的结果。否则进入下一阶段;
服务器端进行SQL解析,预处理,再由优化器生成对应的执行计划;
MySql根据优化器生成的执行计划,调用存储引擎的API执行查询;
返回结果给客户端
select * 为什么会降低查询效率?
获取数据&传输结果
分析原因
1,数据库需要知道*等于什么,查数据字典(进行数据库设计的时候,对数据库元素进行的解释说明),这在分析阶段就会增大开销。
2,select *最大的问题是可能会多出一些不用的列,这就杜绝了索引覆盖的可能性,导致查询的成本几何级增高(索引覆盖:就是select的数据列只用从索引中就能够取得,不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。)
3,网络开销,不需要的字段会增加数据传输的时间,在本地客户端连的是本地mysql服务器,TCP协议传输数据会增加额外的时间;数据量越大这种这种劣势就会越明显;如果db和客户端不在同一台机器,那这种开销就更加明显
4,mysql拿到一条命令,会去解析命令、优化查询,然后去存储引擎执行查找, Select*数据库会解析更多的 对象,字段,权限,属性相关,在 SQL 语句复杂,会对数据库造成沉重的负担。
5,从另外一个角度来看;当查询进行的时候,多取了不必要的列,数据字段比较多,mysql并不是把所有结果全部得到后再进行一次性保存,而是每次分配一块大小的内存空间保存结果集,使用完后,接着再分配一个这样的块,如果还不不够,接着再分配一个块,依此类推,也就是说,有可能在一次查询中mysqI要进行多次内存分配的操作,频繁操作内存都是要耗费时间的。
6,原则上讲作为有着良好编程习惯的程序员,也不应该获取自己不需要的东西,若是执行select*,以后表结构修改了,如原表加减了某些列,对代码影响也很大。
NO;优秀的程序猿,不会获取自己不需要的东西。
navicat for mysql
查看时间论证结论
缓存机制
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
唯一索引
By : Bigdudada