一、MySql为什么要分库分表
1、分库分表:主要是当前库的承载能力满足不了日益增加的业务需求,每天都会产生大量的数据,导致对数据操作出现瓶颈。
分库策略:常用的是根据业务需求进行分库:比如按照用户的维度对数据进行分库等
分表策略:一般常用的是按照日期的维度进行分表,尤其是在数据中台对ads表或者ods表进行处理的时候,大部分都是按照日期的维度分表
二、分库分表产生的问题
(1):ID生成问题,数据库被切割后,不能再依赖数据库自身的主键生成机制,可以考虑uuid或者使用分布式id算法,或者redis生产id
(2):查询问题:跨节点查询,比如包含join: 其实可以进行分开查询,不同的节点把数据查询出来,然后通过后台代码进行join
(3):聚合查询(group by,order by)问题:可以再各个节点上取得结果,然后再后端进行合并
(4):事务问题:可以使用分布式事务: 两阶段提交或者TCC
常用count(*) count(1) count(列名)区别
1、count(*) 包含所有的列 不忽略NULL值
2、count(1) 忽略所有的列 不忽略NULL值
3、count(列名) 会忽略列值为NULL
效率比较
列名为主键,count(列名)会比count(1)快, 反之,count(1) 比较快
如果有主键,则 select count(主键)的执行效率是最优的
如果表只有一个字段,则 select count(*)最优