1.5k 1 分钟

# 基础

索引在引擎层实现,不同存储引擎索引的实现不同。

# B-Tree 索引

非叶子节点存储索引键值,叶子结点存储实际数据。
索引由多个列组成时,只对以下类型查询有效,适配 WHERE、ORDER BY 和 GROUP BY:

  • 全值匹配,匹配索引中的所有列
  • 匹配最左前缀,匹配索引中的第一列
  • 匹配列前缀,匹配索引中第一列的值的开头部分
  • 匹配范围值,匹配索引中第一列的范围
  • 精确匹配某一列并范围匹配另外一列,匹配的列中前面的列精确匹配,最后的列范围匹配
  • 只访问索引的查询,即覆盖索引

1.4k 1 分钟

# 选择优化的数据类型

# 存储类型选择原则

  • 使用最小数据类型,占用磁盘、内存和 CPU 缓存更少,需要更少的 CPU 周期,所以更快
  • 使用更简单的数据类型,需要更少的 CPU 周期
  • 尽量避免 NULL,会使得索引、索引统计和值比较更复杂

1.1k 1 分钟

# 性能剖析介绍

  • 性能剖析是测量和分析时间花费在哪里的主要方法。
  • 性能剖析一般有两个步骤:测量任务所花费的时间,然后对结果进行统计和排序,将重要的任务排到前面。
  • 完成一项任务所需要的时间可以分为两部分:执行时间和等待时间。
  • 值得优化的查询是那些占总响应时间比重大的,也就是说优化收益大的。
  • 某些任务即使没有出现在性能剖析输出的前面也要优化,比如异常情况。
  • 好的性能剖析工具应该显示可能的丢失时间,也就是任务的总时间和实际测量的时间之差。
  • 性能剖析无法显示所有响应时间的分布,不能只相信平均值,可以使用直方图、百分比、标准差等来分析。

440 1 分钟

Java 的内存区域被分为:

  • 方法区
  • 程序计数器
  • 虚拟机栈
  • 本地方法栈

3.4k 3 分钟

Java 与 C++ 一个很不一样的地方就在于,C++ 需要开发人员手动释放内存空间,而 Java 不需要,虚拟机会帮忙做这件事情。

Java 的内存区域中,虚拟机栈、本地方法栈和程序计数器都是线程相关的,会随着线程的消失而释放。而堆和方法区是线程无关的,所以需要虚拟机来管理内存。

3.2k 3 分钟

ConditionObject 是 AQS 的内部类,是线程进行等待的条件对象,实现了 Condition 接口。也可以借助 Condition 来进行线程间的通信。

2k 2 分钟

# 前言

CountDownLatch 是一种减法计数器,可以让一个或多个线程等待,常应用于 m 个线程需要等待其他 n 个线程执行完某个逻辑,才能继续执行的场景。