使用kingshard遇到的坑

时间:2021-10-14 06:48:50
  1. 禁止用mysqldump 连接kingshard, 会导致表锁死
  2. 读取NULL值变为文本
    1. 通过kingshard连接 select出来的null值变为文本"NULL"
  3. kingshard 无法join分片表
    1. 假设a与b都是分片表, 即使a与b分片一致也无法join
    2. kingshard只能在分片表与不分片表之间join
    3. 不使用join,改写为嵌套语句 kingshard也不支持
  4. kingshard分片前先预估数据量和iops
    1. iops满了 必须分物理机才能解决
  5. kingshard不支持insert on duplicated key update这样的高级语句 会报语句过于复杂错误 只能支持insert/replace
    1. 使用replace语句会比insert on duplicated key update的iops高很多
  6. kingshard不支持过程,使得一些分表操作的过程原子性无法保证,如果需要达到过程原子性,请仔细设计和衡量
  7. 套表不要使用文本键作为kingshard分片键 会导致大量消耗数据库存储空间
    1. 如果文本键仅用于一个分片表可以
    2. 如果文本键用于一组表的分片 会导致一组表都需要存储 并 索引这个分片键 从而大量消耗磁盘空间
      1. 如果一定要用kingshard在一组表中用文本键分表, 那么必须选择一张表作为核心表 在核心表上存储文本键及其索引
      2. 在附属表用使用主表的id做为索引分片 但这样会导致核心表和附属表不在一个分片上 无法使用join等复杂语句 不推荐
      3. 这种情况 推荐使用程序代码按文本键直接计算分片表 这样可以分表键 仅用于程序逻辑 不需要存储在数据库磁盘上
  8. kingshard 无法在插入时同时声明 分片键与主键 会报过于复杂
    1. insert into (id, shard_key, value) values('assigned_id', 'shard_key_value', 'custom_value') 这样的语句就是同时声明主键与分片键
    2. 只要声明主键就会报语句过于复杂, 哪怕主键指定为null
      总体:
      好处,语言中立,不用对分片硬编码,采用并发模式 分片越多 跨分片查询越有利
      坏处,多了很多SQL语言限制,还有奇怪的转义
      对于SQL语句 推荐给所有from join的表 在语句中起一个别名, 这样如果表分片调整时 只需要修改指定名称即可