美文网首页
TiDB 用户手册

TiDB 用户手册

作者: 葬雪晴 | 来源:发表于2019-04-23 17:38 被阅读0次

    TiDB 用户手册

    一、TiDB是什么

    TiDB 是 PingCAP 公司设计的开源分布式 HTAP (Hybrid Transactional and Analytical Processing) 数据库,结合了传统的 RDBMS 和 NoSQL 的最佳特性。TiDB 兼容 MySQL,支持无限的水平扩展,具备强一致性和高可用性。TiDB 的目标是为 OLTP (Online Transactional Processing) 和 OLAP (Online Analytical Processing) 场景提供一站式的解决方案。

    TiDB 具备如下特性:

    • 高度兼容 MySQL

      大多数情况下,无需修改代码即可从 MySQL 轻松迁移至 TiDB,分库分表后的 MySQL 集群亦可通过 TiDB 工具进行实时迁移。

    • 水平弹性扩展

      通过简单地增加新节点即可实现 TiDB 的水平扩展,按需扩展吞吐或存储,轻松应对高并发、海量数据场景。

    • 分布式事务

      TiDB 100% 支持标准的 ACID 事务。

    • 真正金融级高可用

      相比于传统主从 (M-S) 复制方案,基于 Raft 的多数派选举协议可以提供金融级的 100% 数据强一致性保证,且在不丢失大多数副本的前提下,可以实现故障的自动恢复 (auto-failover),无需人工介入。

    • 一站式 HTAP 解决方案

      TiDB 作为典型的 OLTP 行存数据库,同时兼具强大的 OLAP 性能,配合 TiSpark,可提供一站式 HTAP 解决方案,一份存储同时处理 OLTP & OLAP,无需传统繁琐的 ETL 过程。

    • 云原生 SQL 数据库

      TiDB 是为云而设计的数据库,支持公有云、私有云和混合云,使部署、配置和维护变得十分简单。

    二、何时迁移TiDB。

    TiDB与MySQL比较

    与MySQL相比的优势

    • 业务不用受限于MySQL单表大小限制,无需分表分库。
    • 业务上可以无感扩容,可以随着集群的增长提升性能。
    • 业务上可以在TiDB上进行海量数据少量分析功能。

    与MySQL相比的劣势

    • 机器成本相对较高,需要业务上进行评估。
    • 与MySQL本身少量不同,会导致业务上需要适应TiDB的方式。

    迁移TiDB的时机

    • 当单表超过2000万,并且预计一年内至少能翻倍。
    • 该大表为业务表,数据不能删除。
    • 有相对复杂的数据分析需求时,并不想用到大数据去分析。
    • 业务价值较高。
    • 访问上没有明显的热点。

    三、TiDB 迁移注意点

    由于分布式数据库和单机数据库的差别,虽然TiDB已经能比较完整的支持MySQL语法,但是在内在机制还是有区别,所在进行迁移的时候需要注意的几点。

    事物机制的区别

    特别关注启用了Transaction事物,特别是依赖该事物中的update返回值是否成功的语句。要解决这个问题推荐使用select ..for update,或者是关闭数据库中的自动重试机制。

    TiDB为乐观锁机制,而MySQL为悲观锁机制。会造成语义上的困扰。下表为例子,TiDB不会进行阻塞而是会新启一个事物进行重试。

    session1 session2
    begin;
    insert bill value (10,100,99);
    update account set balance set balance=99 where useId=10 and version=5; begin;
    commit; insert bill value (10,100,99);
    update account set balance set balance=99 where useId=10 and version=5;
    commit;
    session2.1
    begin;
    insert bill value (10,100,99);
    update account set balance set balance=99 where useId=10 and version=5;
    commit;

    自增 ID 连续性问题

    推荐:尽量不使用数据库提供的自增id,严禁自增与自定义混用。

    假设集群中有两个 tidb-server 实例 A 和 B(A 缓存 [1,30000] 的自增 ID,B 缓存 [30001,60000] 的自增 ID),依次执行如下操作:

    1. 客户端向 B 插入一条将 id 设置为 1 的语句 insert into t values (1, 1),并执行成功。
    2. 客户端向 A 发送 Insert 语句 insert into t (c) (1),这条语句中没有指定 id 的值,所以会由 A 分配,当前 A 缓存了 [1, 30000] 这段 ID,所以会分配 1 为自增 ID 的值,并把本地计数器加 1。而此时数据库中已经存在 id 为 1 的数据,最终返回 Duplicated Error 错误。

    限制事物大小

    每个事务的行数不超过 200 行,且单行数据小于 100k ,严禁大事物,长事物提交。

    由于TiDB是分布式事物存储的过程采用的是二段提交,单个事物不能过程过大(这也是分布式系统的要求)。但是在对单体数据库的应用中往往会使用到例如:Delete * from t where xx ; 这种语句不能直接在TiDB中执行,或者通过TiDB中的设置会造成与MySQL不同的结果(TiDB会分批次delete,有可能有些成功有些失败)。

    解决办法

    • 添加 limit Delete * from t where xx limit 5000;

    • 循环操作。

      • 截断时间方式
      for i from 0 to 23:
          while affected_rows > 0:
              delete * from t where insert_time >= i:00:00 and insert_time < (i+1):00:00 limit 5000;
              affected_rows = select affected_rows()
      
      • 有序ID最小值的方式
      select min(id) minId from t where create_time > 'xx:xx:xx' and create_time < 'yy:yy:yy' ;
      select * from t where create_time > 'xx:xx:xx' and create_time < 'yy:yy:yy' id>=minId order by id limit 0,1000;
      while (select.size() != 0) {
           //do something
           max_id = select max_id();
           select * from t where create_time > 'xx:xx:xx' and create_time < 'yy:yy:yy' id>=max_id order by id limit 0,1000;
      }
      

    索引选择问题

    相对复杂的索引选择建议手动指定索引,防止脱离索引的慢查询。每条复杂SQL必须检索引执行情况。

    在TiDB选择上与MySQL有区别,由于单表的数据量过大,TiDB的统计信息更新不如MySQL及时,而且两者的优化有所不同,会造成在CBO过程中与MySQL中不一致。

    如table中有索引如下:

    index(bz_id,code,type)
    

    执行以下语句时

    select * from table where bz_id='s123' and code =32 and type = 12 order by id limit 1;
    

    有可能会发生无法正确选对索引造成全表扫描的慢查询。

    相关文章

      网友评论

          本文标题:TiDB 用户手册

          本文链接:https://www.haomeiwen.com/subject/gnrbgqtx.html