获得徽章 1
- #青训营笔记创作活动#
1月28日 打卡day12
今日学习
1. cat 文件名.后缀 :查看文件🏫 cat 文件 | head -n 10 :查看文件前十行
🏫 cat 文件 | tail -n 10:查看文件后十行
🏫 cat 文件 | grep 某关键字 -c :查看文件某关键字的个数
2. tail :【动态】追加查看日志文件展开赞过评论1 - #青训营笔记创作活动#
1月27日 打卡day11
今日学习
1. 索引 (类似于字典里边的目录)
2. 创建索引:CREATE INDEX indexname ON tableName(columnName(length)[ASC | DESC])
🐷 这种创建方式可以给一张已存在的表结构添加索引,其中需要指定几个值:🏫 indexName:当前创建的索引,创建成功后叫啥名字。
🏫 tableName:要在哪张表上创建一个索引,这里指定表名。
🏫 columnName:要为表中的哪个字段创建索引,这里指定字段名。
🏫 length:如果字段存储的值过长,选用值的前多少个字符创建索引。
🏫 ASC|DESC:指定索引的排序方式,ASC是升序,DESC是降序,默认ASC。
展开赞过评论1 - #青训营笔记创作活动#
1月26日 打卡day10
今日学习
1. 锁分类
🐷 以锁粒度的维度划分
1)表锁
2)页面锁
3)行锁
🐷 以互斥性的维度划分
1)共享锁
2)排他锁
3)共享排他锁
🐷 以操作类型划分
1)读锁
2)写锁
🐷 以加锁的维度划分
1)显示锁
2)隐式锁
🐷 以思想的维度划分
1)乐观锁:每次执行前认为自己会成功,因此先尝试执行,失败时再获取
2)悲观锁:每次执行前都认为自己无法成功,因此会先获取锁,然后再执行。展开评论点赞 - #青训营笔记创作活动#
1月25日 打卡day9
1. redis简介
Remote Ditionary Server 是一个开源的、键值对型的数据存储系统。使用C语言编写,遵守BSD协议,可基于内存也可持久化的日志型数据库,提供了多种语言的API,被广泛用于数据库、缓存和消息中间件。并且支持多种类型的数据结构,用于应对各种不同场景。可以存储多种不同类型值之间的映射,支持事务,持久化,LUA 脚本以及多种集群方案等。
2. 优缺点
🐷 优点
完全基于内存操作,性能极高,读写速度快,Redis 能够支持超过 100KB/s 的读写速率
支持高并发,支持10万级别的并发读写
支持主从模式,支持读写分离与分布式
具有丰富的数据类型与丰富的特性(发布订阅模式)
支持持久化操作,不会丢失数据
🐷 缺点:
数据库容量受到物理内存的限制,不能实现海量数据的高性能读写
相比关系型数据库,不支持复杂逻辑查询,且存储结构相对简单
虽然提供持久化能力,但实际更多是一个 disk-backed 功能,与传统意义上的持久化有所区别展开评论点赞 - #青训营笔记创作活动#
1月20日 打卡day8
今日学习
1. Github Desktop:可以使用git可视化工具
2. 图片在线压缩
①tinypng.com
②squoosh.app (大图片)
3. 表情符:www.emojiall.com(可以直接复制粘贴)
4. 封面模板:www.canva.cn(免费的素材和模板)
5. 在线画图:boardmix.cn(流程图或思维导图)
展开评论点赞 - #青训营笔记创作活动#
1月19日 打卡day7
今日学习
1. 慢sql优化
🐷 slow query log:表示慢查询开启的状态
🐷 slow_query_log_file: 表示慢查询日志存放的位置
2. explain分析SQL的执行计划
🐷 type表示连接类型,查看索引执行情况的一个重要指标。以下性能从好到坏依次:system > const > eq_ref > ref > ref_or_null > index_merge > unique_subquery > index_subquery > range > index > ALL
3. profile 分析执行耗时\
🐷 explain只是看到SQL的预估执行计划,如果要了解SQL真正的执行线程状态及消耗的时间,需要使用profiling。开启profiling参数后,后续执行的SQL语句都会记录其资源开销,包括IO,上下文切换,CPU,内存等等,我们可以根据这些开销进一步分析当前慢SQL的瓶颈再进一步进行优化。
🐷 show variables like '%profil%'查看是否开启
🐷 使用set profiling=ON开启
4. Optimizer Trace分析详情
5. 确定问题并采用相应的措施展开评论点赞 - #青训营笔记创作活动#
1月18日 打卡day6
今日学习
1. 重点:编程思维的转变
✨ 刷官方文档,重实践
2. 开发顺序(数据驱动设计)
1)通读一遍需求文档和原型图
2)梳理业务逻辑,进行抽象,明确有多少个功能需求要开发
3)根据功能需求创建数据库,创建表,添加字段,设置合适的字段类型,长度和主外键等
4)考虑业务场景创建索引
5)疯狂CRUD
6)疯狂Cache
7)疯狂给客户端提供数据接口
8)持续迭代:根据业务增长做负载均衡、分库分表、读写分离展开评论点赞 - #青训营笔记创作活动#
1月17日 打卡day5
学习笔记
如何写出漂亮的代码?
1. 规范命名
✨ 见名知意
✨ 能读出来
2. 规范代码格式
✨ 合适的缩进
3. 代码注释
✨ 解释代码的意图,说明为什么这么写,用来做什么
✨ 对参数和返回值注释,入参代表什么,出参代表什么
✨ 有警示作用,比如说入参不能为空,或者代码是不是有坑
✨ 当代码还未完成时可以使用 todo 注释来注释
4. try catch 内部代码抽成一个方法
✨ 美观简洁
5. 一个方法(函数)不要太长,可以分成多个方法(函数)
6. 抽取重复代码
✨ 定义方法(函数)
7. return 优化 if else 分支语句
8. 优雅的参数校验
✨ 调用第三方库
9. 统一返回值
10. 统一异常处理
11. 日志打印规范
✨ 可搜索性,要有明确的关键字信息
✨ 异常日志需要打印出堆栈信息
✨ 合适的日志级别,比如异常使用error,正常使用info
✨ 日志内容太大不打印,比如有时需要将图片转成Base64,那么这个Base64就可以不用打印
12. 类和方法单一职责
13. pojo类重写 toString 的方法
✨ 方便打印测试
14. 资源释放写在 finally 里边
✨ 保证资源的释放
15. 使用线程池替代手动创建线程
✨ 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
✨ 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
✨ 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统 的✨ 稳定性,使用线程池可以进行统一的分配,调优和监控。
16. 线程设置名称
✨ 日志打印出来的时候便于查看
17. 远程接口调用设置超时时间
✨ 防止因各种未知原因,导致线程“卡死”
18. 集合的使用应指明初始化大小
19. 需要什么字段就 select 什么字段
✨ 减少不必要的网络传输
20. 开发伙伴多沟通
✨ 写代码忌闭门造车展开评论点赞 - #青训营笔记创作活动#
1月16日 打卡day5
学习笔记
如何写出漂亮的代码?
1. 规范命名
✨ 见名知意
✨ 能读出来
2. 规范代码格式
✨ 合适的缩进
3. 代码注释
✨ 解释代码的意图,说明为什么这么写,用来做什么
✨ 对参数和返回值注释,入参代表什么,出参代表什么
✨ 有警示作用,比如说入参不能为空,或者代码是不是有坑
✨ 当代码还未完成时可以使用 todo 注释来注释
4. try catch 内部代码抽成一个方法
✨ 美观简洁
5. 一个方法(函数)不要太长,可以分成多个方法(函数)
6. 抽取重复代码
✨ 定义方法(函数)
7. return 优化 if else 分支语句
8. 优雅的参数校验
✨ 调用第三方库
9. 统一返回值
10. 统一异常处理
11. 日志打印规范
✨ 可搜索性,要有明确的关键字信息
✨ 异常日志需要打印出堆栈信息
✨ 合适的日志级别,比如异常使用error,正常使用info
✨ 日志内容太大不打印,比如有时需要将图片转成Base64,那么这个Base64就可以不用打印
12. 类和方法单一职责
13. pojo类重写 toString 的方法
✨ 方便打印测试
14. 资源释放写在 finally 里边
✨ 保证资源的释放
15. 使用线程池替代手动创建线程
✨ 降低资源消耗。通过重复利用已创建的线程降低线程创建和销毁造成的消耗。
✨ 提高响应速度。当任务到达时,任务可以不需要的等到线程创建就能立即执行。
✨ 提高线程的可管理性。线程是稀缺资源,如果无限制的创建,不仅会消耗系统资源,还会降低系统 的✨ 稳定性,使用线程池可以进行统一的分配,调优和监控。
16. 线程设置名称
✨ 日志打印出来的时候便于查看
17. 远程接口调用设置超时时间
✨ 防止因各种未知原因,导致线程“卡死”
18. 集合的使用应指明初始化大小
19. 需要什么字段就 select 什么字段
✨ 减少不必要的网络传输
20. 开发伙伴多沟通
✨ 写代码忌闭门造车展开1点赞 - #青训营笔记创作活动#
1月15日 day3
学习日志
1.一张数据表一般对应一颗或多颗树的存储,树的数量与建索引的数量有关,每个索引都会有一颗单独的树。
2.聚簇索引和非聚簇索引:
①主键索引也是聚簇索引,非主键索引都是非聚簇索引。除格式信息外,两种索引的非叶子节点都是只存索引数据的,比如索引为id,那非叶子节点就是存的id数据。
②叶子节点的区别如下:
聚簇索引的叶子节点一般情况下存的是这条数据的所有字段信息。所以我们 select * from table where id = 1 的时候,都是要去叶子节点拿数据的。
非聚簇索引的叶子节点存的是这条数据所对应的主键和索引列信息。比如这条非聚簇索引是username,然后表的主键是id,那该非聚簇索引的叶子节点存的就是 username 和 id,而不存其他字段。
相当于是先从非聚簇索引查到主键的值,再根据主键索引去查数据内容,一般情况下要查两次(除非索引覆盖),这也称之为 回表 ,就有点类似于存了个指针,指向了数据存放的真实地址。
3. B+树的查询是从上往下一层层查询的,一般情况下我们认为B+树的高度保持在3层以内是比较好的,也就是上两层是索引,最后一层存数据,这样查表的时候只需要进行3次磁盘IO就可以了(实际上会少一次,因为根节点会常驻内存),且能够存放的数据量也比较可观。
如果数据量过大,导致B+数变成4层了,则每次查询就需要进行4次磁盘IO了,从而使性能下降。所以我们才会去计算InnoDB的3层B+树最多可以存多少条数据。
MySQL每个节点大小默认为16KB,也就是每个节点最多存16KB的数据,可以修改,最大64KB,最小4KB。
4. MySQL每个节点大小默认为16KB,也就是每个节点最多存16KB的数据,可以修改,最大64KB,最小4KB。
5. MySQL查询速度主要取决于磁盘的读写速度,因为MySQL查询的时候每次只读取一个节点到内存中,通过这个节点的数据找到下一个要读取的节点位置,再读取下一个节点的数据,直到查询到需要的数据或者发现数据不存在。展开评论点赞