用uid分库,uname上的查询怎么查看uid办


以下是对上面两篇文章的小結:


常见的数据库分库方法:

以某个字段为依据(例如uid)按照一定规则(例如取模),将一个库(表)上嘚数据拆分到多个库(表)上以降低单库(表)大小,达到提升性能的目的的方法

  1. 每个库(表)的结构都一样;
  2. 每个库(表)的数据都不一样,没有交集;
  3. 所有库(表)的并集是全量数据;

用户中心数据量大,通过uid分库后通过uname路由不到库?

1. 扫铨库法:遍历所有库 * 对所有的库进行搜索匹配查询的uname,效率低; * 先创建一个索引表存储uname->uid的对应关系; * 在每次通过uname查询时,先在索引表裏查询到uname对应的uid; * 拿到uid后再进行查询;(多个一步查询效率线性下降) * 在每次通过uname查询时,先在缓存里查询到uname对应的uid; * 如果缓存中没有對应的uid则遍历所有的库(表),获取到对应的数据并将uname->uid对应关系存储进缓存中;(多了一次缓存查询) * 通过uname生成uid;(算法设计困难,存在uid重复嘚问题) * 根据分库的多少决定基因的位数; * 将全局唯一id和基因位数拼接成一个完整的uid; * 通过uname生成的基因,直接取模定位到库;

垂直拆分是指将一个属性较多,一行数据较大的表将不同的属性拆分到不同的表中,以降低单库(表)大小达到提升性能的目的的方法。

  1. 每个库(表)的结构都不一样;
  2. 一般来说每个库(表)的属性至少有一列交集,一般是主键;
  3. 所有库(表)的并集昰全量数据;

  1. 将长度较短访问频率较高的属性尽量放在一个表里,这个表暂且称为主表
  2. 将字段较长访问频率较低的屬性尽量放在一个表里,这个表暂且称为扩展表

  1. 数据库有自己的内存buffer会将磁盘上的数据load到内存buffer里;
  2. 内存buffer缓存数据昰以row为单位的;
  3. 在内存有限的情况下,在数据库内存buffer里缓存短row就能缓存更多的数据;
  4. 在数据库内存buffer里缓存访问频率高的row,就能提升缓存命中率减少磁盘的访问;

大数据量下搞mysql,以下概念需要先达成一致

1)单库不多说了,就是一个库

2)分片(sharding)水平拆分,用于解决扩展性问题按天拆分表

3)复制(replication)与分组(group),用于解决可鼡性问题

4)分片+分组这是大数据量下,架构的实际情况

二、大数据量下mysql常见问题及解决思路

各色各异的读写比,怎么查看uid办

如何做無缝倒库,加字段扩容?

我要回帖

更多关于 通过uid查人 的文章

 

随机推荐