每周完成一个ARTS:(Algorithm、Review、Tip、Share, ARTS)
* Algorithm 每周至少做一个 leetcode 的算法题-主要是为了编程训练和学习
* Review 阅读并点评至少一篇英文技术文章-主要是为了学习英文,如果你的英文不行,你基本上无缘技术高手
* Tip 学习至少一个技术技巧-主要是为了总结和归纳你在是常工作中所遇到的知识点
* Share -- 分享一篇有观点和思考的技术文章-主要是为了建立你的影响力,能够输出价值观
算法链接:https://leetcode-cn.com/problems/two-sum/
给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标。
你可以假设每种输入只会对应一个答案。但是,你不能重复利用这个数组中同样的元素。
示例 1:
给定 nums = [2, 7, 11, 15], target = 9
因为 nums[0] + nums[1] = 2 + 7 = 9
所以返回 [0, 1]
解:
方法一:
class Solution {
public int[] twoSum(int[] nums, int target) {
Map map = new HashMap<>();
for (int i = 0; i < nums.length; i++) {
int complement = target - nums[i];
if (map.containsKey(complement)) {
return new int[] { map.get(complement), i };
}
map.put(nums[i], i);
}
throw new IllegalArgumentException("No two sum solution");
}
}
方法二:
class Solution {
public int[] twoSum(int[] nums, int target) {
int[] a = new int[2];
for(int i = 0;i
暂无
分享一下如何将windows系统当作linux使用。我们在微软商店可以下载名为Ubuntu的软件。安装完成后,我们只需要在cmd控制台输入bash,就可以进入linux系统。例如IDEA提供了内嵌的Terminal,让我们可以在开发的时候直接使用cmd,有了上面的软件,我们就可以在IDEA界面使用linux,方便我们开发。
在看了一个MySQL专栏以后,对第一篇的知识进行总结和归纳
1、 MySQL的框架有几个组件,各是什么作用?
MySQL主要包含两层,分别为Server层和引擎层。Server层包括连接器、查询缓存、分析器、优化器、执行器、binglog日志模块。存储引擎层负责数据的存储和提取。其架构模式是插件式的,支持InnoDB、MyISAM、Memory等多个存储引擎。5.5.5版本后,默认创建的是InnoDB。
连接器:连接器负责跟客户端建立连接(先通过TCP,然后在验证账号密码)、获取权限(后续操作只要不断开连接,权限就算被其他账号修改也不会改变,除非重新连接)、维持(长时间不操作默认连接8小时)和管理连接。可以使用showprocesslist查看连接信息。连接分长连接(指连接成功后,如果客户端持续有请求,则一直使用同一个连接)和短连接(指每次执行完很少的几次查询就断开连接,下次查询再重新建立一个),因为建立连接过程复杂,推荐使用长连接。如果发现长连接内存涨的快(因为执行过程中临时使用的内存是在连接对象里的),可以采用①定期或者在执行一个占用内存大的查询后断开重连。②在5.7版本以后,可以使用mysql_reset_connection初始化连接资源,这个过程不用重连和重新做权限验证。
查询缓存:先去查询缓存(之前执行过的语句会以key-value对的形式保存到缓存,key为查询语句),查到就直接返回,没查到就执行下面步骤。不推荐使用缓存,查询缓存往往利大于弊。因为一旦表进行更新,这个表的缓存就会全部清空。更新压力大的数据库来说,查询缓存的命中率会非常低。除非是静态表(很久做一次更改的:系统配置表),才推荐使用缓存查询。建议将query_cache_type设为DEMAND,然后SQL默认不缓存,对要缓存的语句添加SQL_CACHE显性指定(mysql>selectSQL_CACHE*fromTwhereID=10;)MySQL8.0已经删除该整块功能。
分析器:分为“词法分析”和“语法分析”,校验SQL语句是否符合要求,并生成生成解析器。然后预处理器对解析树进一步分析,验证数据表、字段是否存在,通关之后SQL进入下一步优化器,。
词法分析:识别SQL语句中的字符串分别是什么,代表什么(例如select标识为查询,将w_user标记为表名,将id,name等标记为列名)。
语法分析:根据语法规则,判断SQL语句是否满足MySQL语法。
优化器:在表里面有多个索引的时候,决定使用哪个索引;或者在一个语句有多表关联(join)的时候,决定各个表的连接顺序(mysql>select*fromt1joint2using(ID)wheret1.c=10andt2.d=20;例如在这个语句中是先查出t1.c=10的ID值,然后在这些ID中查t2.d=20还是先查t2.d=20,再查t1.c=10的值。逻辑一样,但是效率不一样,这个由优化器选择)。
执行器:用优化后的SQL执行查询。查询步骤:①查看你有没有权限(连接时获取的权限)对这个表进行查询。②没有权限就报错,有权限就根据引擎提供的接口去查询,然后返回数据。例如:
如果查询字段有索引,就先调用引擎的“取这个表第一行”接口,比较ID,然后一直调用“取下一行”接口,直到这个表的最后一行,之后将查询结果返回。
如果有索引,就先调“取满足条件的第一行”接口,比较ID,然后一直调“取满足条件的下一行”接口,直到所有满足条件数据查询完。
在慢查询日志中,可以看到rows_examined的字段,表明执行过程中扫描了多少行。
PS:Connect_timeout指一次查询等待的时间,
wait_timeout指连接完成后使用过程中等待时间。
2、Server层和存储引擎层各是什么作用?
Server层主要负责连接,SQL检查和优化,以及选择调用引擎的哪个接口。引擎层主要负责提供查询或更改数据文件的接口给Server,同时保证了事务。
3、you have an error in your SQL syntax这个报错是在词法分析里还是在语法分析里报错?
在语法分析报错,词法分析只是解析出这些单词,整个语句是否正确在语法分析中。
4、对于表的操作权限验证在哪里进行?
对于表操作权验证在执行器进行(如果命中缓存,则也会验证权限)