生活小感悟,技术小总结

算法基础

  • 排序算法总结
算法名词 平均时间复杂度 最好时间复杂度 最坏时间复杂度 空间复杂度 稳定性
冒泡排序 O(n2) O(n) O(n2) O(1) 稳定
选择排序 O(n2) O(n2) O(n2) O(1) 不稳定
插入排序 O(n2) O(n) O(n2) O(1) 稳定
快速排序 O(N*logN) O(N*logN) O(n2) O(N*logN) 不稳定
归并排序 O(N*logN) O(N*logN) O(N*logN) O(n) 稳定
堆排序 O(N*logN) O(N*logN) O(N*logN) O(1) 不稳定
  • 冒泡排序通过两两比较进行排序

  • 快速排序就是采用分治的思想,先排好一堆再排一堆:随机取一个数,大的放右边,小的放左边,对这个数排好后再对小的那堆用同样方法排序,依次递归。

  • 选择排序就是选最小,每次从无序空间选出最小的放到有序空间

  • 插入排序就是在插入时候进行排序,每从无序空间随便选一个数和有序空间逐一比较来插入

  • 归并排序也是用了分治,先排好一堆再排一堆,特点就是一直分,到最小单元然后再一个个排好序(治),因此是不管什么情况时间复杂度都是O(N*logN),反正要切分到最小。

数据库

MySQL

  • 索引的作用是加快数据的查询速度,副作用是增加了插入的开销。

  • Innodb 存储引擎的 B-Tree 索引是 B+Tree,也就是在每一个Leaf Node 上面除了索引还有下一个LeafNode 的指针信息,这主要是为了加快检索多个相邻 Leaf Node 的效率考虑。

  • MySQL 中的 B-Tree 索引的物理文件大多都是以 Balance Tree 的结构来存储的,其到每个 LeafNode 的最短路径的长度都是相同的

  • 索引的实现方式:
    1.跳表,适合等值查询,不支持范围查询
    2.有序数组,适合范围查询,但是插入数据效率低,因为需要挪动数据
    3.n叉树,支持等值查询以及范围查询,是个折中方案。大部分数据库都是采用这种数据结构构建索引。

  • mysql的myisam与innodb在执行没有带条件的count(*)语句的时候,实现的思路是不一样的。

  • myisam会在写入的时候记录总记录数在查询的时候直接读取,因此速度快。而innodb因为支持事务,
    且默认的事务隔离级别是可重复读,其MVCC设计实现使得其必须每次都要一行行计算,因此速度不如myisam。

  • Innodb的表是索引组织表,主键索引的叶子存的正行数据,而普通索引存储的是主键的id。普通索引需要再通过主键索引找到数据。

  • Mysql有3种锁,全局锁,表级锁,行级锁

  • Mysql中的锁会在需要的时候获取,但是只会在事务结束后才释放。因此对于一个事务中,对于那些争用锁较多的操作尽量放在后面,减少持有锁的时间,提高并发度。

  • 在更新的时候,如果数据页在内存中,普通索引和唯一索引之间的区别就一个判断,性能相差不大。但是当数据页不在内存中,唯一索引需要将数据页加载到内存,而普通索引则是直接写入Change buffer,不需要从磁盘加载数据页。

  • 当需要读取更新的数据的时候,会立即触发Change buffer的merge操作写入磁盘。因此change buffer适合写多读少的场景。

  • 对字符串字段做索引,可以整个字段作为索引值,也可以使用前缀作为索引,或者新增字符串hash值列做索引。使用前缀作为索引的时候,要考虑各个长度的区分度问题。长度选择合适的情况,可以做到既不增加磁盘读取次数,又能节省磁盘空间的好处。前缀索引的弊端是不能使用覆盖索引。前缀索引在身份证这种前面N个字符大量相同的情况下,可以对字符串先进行倒序存储然后再做前缀索引。

  • mysql内存中的脏数据flush到磁盘的时候可能会出现性能抖动。mysql会在以下4种情况flush脏数据到内存中
    (1)redo日志满了
    (2)内存放不下脏数据了
    (3)空闲时间
    (4)shutdown前
    特别要注意第一和第二种情况,大多数性能抖动问题就是这两种导致的

编程语言

Golang篇

  • 对于GC很高的,可以尝试用sync.Pool做优化,sync.Pool 是减少GC的利器
shikanon wechat
欢迎您扫一扫,订阅我滴↑↑↑的微信公众号!