海量数据处理之分库分表
查询慢,分库分表副作用,如何解决。
关系型数据库如: Mysql, sqlserver. 为了快速检索,采用B树或者其他索引技术。
表中数据越多,索引树的范围越大,磁盘读取越多,性能越低。
-
读写分离,主数据库用于写入,读数据库(多个)用于对外提供查询,通过数据复制的方式将主数据库的数据同步到读库。该框架提升了数据库的读写能力,但对于主数据库的写入能力依然没法扩展。
-
数据库分区 (分库分表)
-
按**字段(列)**分区。每个库/表存储不同的字段,即schema 不同,垂直拆分。
拆成用户库,订单库,其他库。 -
按 **数据记录(行)**分区。每个库、表的schema一致,但存储的数据不同,“水平拆分”。
-
1. 水平拆分如何做到平均拆分,防止某一库压力过大。
userid 为分库分表键。采用hash去模的方式将数据散列到不同的库。
不是所有的都适合userid作为分库分表键 但是某个userid记录很多,可能会打爆一个数据库。 一般来说,将一段之间以前的数据归档(如userid 三个月之前的数据)存放到 非关系型数据库 HBase中。
-
2. 分库分表之后要求每个查询的 where 字句中必须携带分库分表键,但并非每个查询都能携带分库分表键的。
按订单号分库分表。如果想查询某个买家的所有订单号,查询没有分表键,就去自动全表扫描。》》》 建立**“异构索引表”**,即采用异步机制将原表内的每次一创建或更新,都换一个维度保存一份完整的数据表或索引表,那空间换时间。 — 也就是说,订单库按照订单号hash取模之后存储,同时也是按照userid维度进行hash取模,再存储一份数据,那么想要获取某一userid的全部订单时,将userid作为分库分表键,就避免全表扫描。