LeanCloud 最佳实践

数据库存在慢查询怎么办

以 Record 为例,如果经常以 user 作为查询条件,那么就可以建立 user 索引

索引的本质是多维护一颗平衡树,这样查找的时候可以将 O(N) 的时间复杂度降低为 O(lgN)

索引对应的值越集中,查询效率越低,比如对性别建立索引

由于需要维护平衡树,每次写入的时候都要更新树,会影响效率,因此读多写少时更适合建立索引

本质就是以写入的时间和额外的空间来换读取的时间

唯一索引:如果索引对应的值不可能重复,则可以设置为唯一索引;反之如果可能重复则不能设置为唯一,否则当出现相同的值时插入会失败。创建唯一索引的目的往往不是为了提高访问速度,而只是为了避免数据出现重复。

可以通过 [数据存储] -> [用量统计] -> [响应时间] 检查优化效果

  • 密集索引:每个索引都对应着一条记录;一个表只能创建一个密集索引
  • 稀疏索引:每个索引可能对应多条记录

首先对密集索引和稀疏索引的区分在与是否为每个索引键的值都建立索引,简单来说就是比如有一列的值如下:

1、2、3、4、5、6、7

密集索引的做法是为这7个值建立索引记录,那么就有7条索引记录,抽象索引记录如下:

1:到1的指针
2:到2的指针
….
7:到7的指针

稀疏索引的做法是将这个6个值分组,1、2、3和4、5、6和7分为不同的3组,取这三组中最小的索引键值作为索引记录中的索引值,抽象索引记录如下:

1:到顺序存储1、2、3的起始位置的指针

4:到顺序存在4、5、6的起始位置的指针

7:到顺序存储7的起始位置的指针

这两种索引都要通过折半查找或者叫做二分查找来确定数据位置,不同的是密集索引,只需要通过二分查找到搜索值=索引的索引记录就能确定准确的数据位置,而稀疏索引则需要先定位到搜索值>索引值的最小的那个,然后在通过起始位置去定位具体的偏移量。
这是两种不同的索引实现,一种建立了索引值与数据位置的1:1的关系,一种建立了索引值与数据位置1:n的关系。在大多数场景密集索引查询效率更高,在大多数场景稀疏索引占用空间更小。

参考:

  1. 数据库存在慢查询怎么办