精华内容
下载资源
问答
  • Recruitment position 我们需要这样的你: NO.1 数据库内核开发工程师 北京 岗位职责: 负责分布式数据库功能组件开发、测试及技术支持 与合作伙伴协同工作,推进产品的迭代参与到开源数据库项目中 增强公司在...







    大数据产业创新服务媒体

    ——聚焦数据 · 改变商业


    关于我们

    HashData是一家专注于云端数据仓库的初创公司,核心团队主要由来自Pivotal、Teradata、IBM、Yahoo!、Oracle和华为等公司资深的云计算、分布式数据库和大数据专家组成。

    凭借深厚的技术积累以及极具前瞻性的产品理念,自创立之初就获得了包括经纬创投、国科嘉和以及金沙江创投等知名投资机构的多轮融资,累积融资额超千万美元。

    我们正在为金融、电信、能源、交通等关系国民经济命脉的重要行业头部客户解决最具挑战性的数据仓库难题:千万级的数据库对象,100+PB数据量,数千个并发应用,以及每天1亿+的复杂SQL查询!

    产品介绍

    作为公司旗舰产品,HashData数据仓库融合了MPP数据库的高性能和丰富分析功能、大数据平台的扩展性和灵活性,以及云计算的弹性和敏捷性,以创新性的元数据、计算和存储三者分离的架构,提供了传统解决方案无法比拟的高并发、弹性、易用性、高可用性、高性能和扩展性。

    典型应用场景的特点是数据量大、查询复杂度高、并发访问高和系统可用性高。除了公有云的数据仓库服务外,针对本土的IT和商业环境特点,HashData还支持私有云和混合云部署。

    加入公司可以得到什么

    与一群技术大拿一起工作,你将收获无限可能!

    你写的每一行代码都将影响着公司的发展,你将亲自参与到公司文化的创造,产品的孵化,与其他成员一起建设公司发展并见证着它的未来。

    除此之外,

    弹性工作+期权激励+20天年假+团建旅游+零食下午茶的福利

    等着你!

    如果你是一位敢于挑战自我的技术研发者,我们欢迎你加入并为你组建技术小组,辅助你完成高挑战工作,同时也欢迎优秀技术实习生的加入。

     


     Recruitment position 

    我们需要这样的你:

     NO.1 数据库内核开发工程师  北京 

    岗位职责: 

    负责分布式数据库功能组件开发、测试及技术支持

    与合作伙伴协同工作,推进产品的迭代参与到开源数据库项目中

    增强公司在开源社区中的声誉参加大数据技术会议和发表技术文章

    任职要求: 

    本科及以上学历,三年以上工作经验

    具有数据库、分布式系统开发工作经验

    熟练使用C/C++ Linux环境下开发,有开源项目经验优先

    熟悉PostgreSQL/Greenplum Database/FoundationDB等开源数据库优先

     NO.2 测试开发工程师  北京 

     

    岗位职责 :

    负责测试框架、测试平台、自动化测试工具的研发和维护

    根据现有的开发与测试流程,找到开发与测试流程存在的问题,给出解决建议

    参与各产品线开发测试流程的制定

    负责自动化测试工具、平台的选型与调研工作

    任职要求 :

    本科及以上学历

    熟练运用Java/Python/Golang语言(其中一种)熟练使用Linux shell编程

    熟悉企业软件开发与测试流程,CICD工具,测试框架

    具有良好沟通能力、团队合作精神、快速学习能力、思维敏捷、逻辑清晰、执行力强、工作责任心强

    有相关开发经验者优先

     

     NO.3 Go开发工程师  北京 

    岗位职责:

    负责云数据仓库大规模部署下,作业调度和状态同步的优化

    负责云数据仓库的元数据缓存和复制的优化

    负责云数据仓库的元数据跨数据中心备份、恢复

    负责云数据仓库的查询性能优化

    任职要求

    计算机及相关专业本科以上学历,2年以上网络服务端或大数据引擎研发经验

    具备扎实的计算机基础,熟悉linux/shell,掌握常用数据结构/算法,至少深入理解一门编程语言:C、C++或Golang

    热爱底层技术,有追求极致性能和工程质量的热情

    有良好的沟通、协调、抗压能力,技术迁移能力强,善于理解和学习,务实自驱,乐于接受新事物

    优先条件(满足下面一条或多条优先考虑):

    掌握服务端主流技术,对缓存、消息队列、负载均衡、分布式存储、分布式事务等有深入理解和实践;

     HDFS/MapReduce/Spark/TiKV 等分布式系统使用、维护或开发经验优先

    具有高并发大数据量系统开发维护经验者优先

     

     NO.4 C++开发工程师  北京 

    岗位职责:

    开发分布式文件系统HDFS、对象存储等)的C++客户端

    开发开源大数据格式(Parquet、ORC等)的C++客户端

    将工作中开发的组件开源,运营相关的开源项目

    参加云计算和大数据技术会议,并发表技术文章

     

    任职要求:

    本科或者以上学历,计算机相关专业

    2年或者以上Linux环境下C++开发经验

    熟练掌握计算机算法、数据结构、操作系统和计算机网络等专业知识

    具有云计算、大数据、分布式计算开发经验优先

    具有耐心及团队合作精神

     

    如果你对相关岗位感兴趣,

    欢迎投递简历或来信至:hr@hashdata.cn

    来吧,HashData期待你的加入!

    2019数据猿年度榜单:

    2019大数据产业趋势人物榜TOP 10

    ●2019大数据产业创新服务企业榜TOP 15

    ●2019大数据产业创新服务产品榜TOP 40

    2020年度榜单,尽情期待!

    —— / END / ——

    好书推荐


    数据猿公益策划榜

     

    #榜样的力量#

    《新冠战“疫”——中国数据智能产业最具社会责任感企业》榜

    展开全文
  • 作者:王刚,网易杭研数据库内核开发工程师 MyRocks 引擎目前是支持行锁的,包括共享锁和排它锁,主要是在 RocksDB 层面实现的,与 InnoDB 引擎的锁系统相比,简单很多。 本文主要介绍 RocksDB 锁结构设计、加锁...

    本文主要介绍 RocksDB 锁结构设计、加锁解锁过程,并与 InnoDB 锁实现做一个简单对比。

    本文由作者授权发布,未经许可,请勿转载。

    作者:王刚,网易杭研数据库内核开发工程师

    MyRocks 引擎目前是支持行锁的,包括共享锁和排它锁,主要是在 RocksDB 层面实现的,与 InnoDB 引擎的锁系统相比,简单很多。

    本文主要介绍 RocksDB 锁结构设计、加锁解锁过程,并与 InnoDB 锁实现做一个简单对比。

    事务锁的实现类是:TransactionLockMgr ,它的主要数据成员包括:

    private:
      PessimisticTransactionDB* txn_db_impl_;
      // 默认16个lock map 分片
      const size_t default_num_stripes_;
      // 每个column family 最大行锁数
      const int64_t max_num_locks_;
      // lock map 互斥锁
      InstrumentedMutex lock_map_mutex_;
    
      // Map of ColumnFamilyId to locked key info
      using LockMaps = std::unordered_map<uint32_t, std::shared_ptr<LockMap>>;
      LockMaps lock_maps_;
      std::unique_ptr<ThreadLocalPtr> lock_maps_cache_;
      // Must be held when modifying wait_txn_map_ and rev_wait_txn_map_.
      std::mutex wait_txn_map_mutex_;
      // Maps from waitee -> number of waiters.
      HashMap<TransactionID, int> rev_wait_txn_map_;
      // Maps from waiter -> waitee.
      HashMap<TransactionID, TrackedTrxInfo> wait_txn_map_;
      DeadlockInfoBuffer dlock_buffer_;
      // Used to allocate mutexes/condvars to use when locking keys
      std::shared_ptr<TransactionDBMutexFactory> mutex_factory_;

    加锁的入口函数是:TransactionLockMgr::TryLock

    Status TransactionLockMgr::TryLock(PessimisticTransaction* txn, //加锁的事务
                                       uint32_t column_family_id, //所属的CF
                                       const std::string& key, //加锁的健 Env* env,
                                       bool exclusive //是否排它锁) {
      // Lookup lock map for this column family id
      std::shared_ptr<LockMap> lock_map_ptr = GetLockMap(column_family_id); //1. 根据 cf id 查找其 LockMap
      LockMap* lock_map = lock_map_ptr.get();
      if (lock_map == nullptr) {
        char msg[255];
        snprintf(msg, sizeof(msg), "Column family id not found: %" PRIu32,
                 column_family_id);
    
        return Status::InvalidArgument(msg);
      }
    
      // Need to lock the mutex for the stripe that this key hashes to
      size_t stripe_num = lock_map->GetStripe(key);// 2. 根据key 的哈希获取 stripe_num,默认16个stripe
      assert(lock_map->lock_map_stripes_.size() > stripe_num);
      LockMapStripe* stripe = lock_map->lock_map_stripes_.at(stripe_num);
    
      LockInfo lock_info(txn->GetID(), txn->GetExpirationTime(), exclusive);
      int64_t timeout = txn->GetLockTimeout();
    
      return AcquireWithTimeout(txn, lock_map, stripe, column_family_id, key, env,
                                timeout, lock_info); // 实际加锁函数
    } 

    GetLockMap(column_family_id) 函数根据 cf id 查找其 LockMap , 其逻辑包括两步:

    1. 在 thread 本地缓存 lock_maps_cache 中查找;
    2. 第1步没有查找到,则去全局的 lock_map_ 中查找。
    std::shared_ptr<LockMap> TransactionLockMgr::GetLockMap(
        uint32_t column_family_id) {
      // First check thread-local cache
      if (lock_maps_cache_->Get() == nullptr) {
        lock_maps_cache_->Reset(new LockMaps());
      }
      auto lock_maps_cache = static_cast<LockMaps*>(lock_maps_cache_->Get());
      auto lock_map_iter = lock_maps_cache->find(column_family_id);
      if (lock_map_iter != lock_maps_cache->end()) {
        // Found lock map for this column family.
        return lock_map_iter->second;
      }
      // Not found in local cache, grab mutex and check shared LockMaps
      InstrumentedMutexLock l(&lock_map_mutex_);
      lock_map_iter = lock_maps_.find(column_family_id);
      if (lock_map_iter == lock_maps_.end()) {
        return std::shared_ptr<LockMap>(nullptr);
      } else {
        // Found lock map.  Store in thread-local cache and return.
        std::shared_ptr<LockMap>& lock_map = lock_map_iter->second;
        lock_maps_cache->insert({column_family_id, lock_map});
        return lock_map;
      }
    }

    lock_maps_ 是全局锁结构:

    // Map of ColumnFamilyId to locked key info
      using LockMaps = std::unordered_map<uint32_t, std::shared_ptr<LockMap>>;
      LockMaps lock_maps_;

    LockMap 是每个 CF 的锁结构:

    struct LockMap {
    
      // Number of sepearate LockMapStripes to create, each with their own Mutex
      const size_t num_stripes_;
    
      // Count of keys that are currently locked in this column family.
      // (Only maintained if TransactionLockMgr::max_num_locks_ is positive.)
      std::atomic<int64_t> lock_cnt{0};
    
      std::vector<LockMapStripe*> lock_map_stripes_;
    
    };

    为了减少加锁时mutex 的争用,LockMap 内部又进行了分片,num_stripes_ = 16(默认值),
    LockMapStripe 是每个分片的锁结构:

    struct LockMapStripe {
    
      // Mutex must be held before modifying keys map
      std::shared_ptr<TransactionDBMutex> stripe_mutex;
    
      // Condition Variable per stripe for waiting on a lock
      std::shared_ptr<TransactionDBCondVar> stripe_cv;
    
      // Locked keys mapped to the info about the transactions that locked them.
      // TODO(agiardullo): Explore performance of other data structures.
      std::unordered_map<std::string, LockInfo> keys;
    };

    LockMapStripe 内部还是一个 unordered_map, 还包括 stripe_mutex、stripe_cv 。这样设计避免了一把大锁的尴尬,减小锁的粒度常用的方法,LockInfo 包含事务id:

    struct LockInfo {
      bool exclusive;
      autovector<TransactionID> txn_ids;
      // Transaction locks are not valid after this time in us
      uint64_t expiration_time;
    };

    LockMaps 、LockMap、LockMapStripe 、LockInfo就是RocksDB 事务锁用到的数据结构了,可以看到并不复杂,代码实现起来简单,代价当然也有,后文在介绍再介绍。

    AcquireWithTimeout 函数内部先获取 stripe mutex ,获取到了在进入AcquireLocked 函数:

    if (timeout < 0) {
        // If timeout is negative, we wait indefinitely to acquire the lock
        result = stripe->stripe_mutex->Lock();
      } else {
        result = stripe->stripe_mutex->TryLockFor(timeout);
      }

    获取了 stripe_mutex之后,准备获取锁:

    // Acquire lock if we are able to
      uint64_t expire_time_hint = 0;
      autovector<TransactionID> wait_ids;
      result = AcquireLocked(lock_map, stripe, key, env, lock_info,
                             &expire_time_hint, &wait_ids);

    AcquireLocked 函数实现获取锁逻辑,它的实现逻辑是:

    1. 在 stripe 的 map 中查找该key 是否已经被锁住。
    2. 如果key没有被锁住,判断是否超过了max_num_locks_,没超过则在 stripe的map 中插入{key, txn_lock_info},超过了max_num_locks_,加锁失败,返回状态信息。
    3. 如果key已经被锁住了,要判断加在key上的锁是排它锁还是共享锁,如果是共享锁,那事务的加锁请求可以满足;
    4. 如果是排它锁,如果是同一事务,加锁请求可以满足,如果不是同一事务,如果锁没有超时,则加锁请求失败,否则抢占过来。

      以上是加锁过程,解锁过程类似,也是需要根据cf_id 和 key 计算出落到哪个stripe上,然后就是从map中把数据清理掉,同时还要唤醒该stripe上的等待线程,这个唤醒的粒度有点大。
    void TransactionLockMgr::UnLock(PessimisticTransaction* txn,
                                    uint32_t column_family_id,
                                    const std::string& key, Env* env) {
      std::shared_ptr<LockMap> lock_map_ptr = GetLockMap(column_family_id);//通过cf_id 获取Lock_Map
      LockMap* lock_map = lock_map_ptr.get();
      if (lock_map == nullptr) {
        // Column Family must have been dropped.
        return;
      }
      // Lock the mutex for the stripe that this key hashes to
      size_t stripe_num = lock_map->GetStripe(key);//根据key 计算落到哪个stripe上
      assert(lock_map->lock_map_stripes_.size() > stripe_num);
      LockMapStripe* stripe = lock_map->lock_map_stripes_.at(stripe_num);
      stripe->stripe_mutex->Lock();
      UnLockKey(txn, key, stripe, lock_map, env); //从锁的map中清理掉该key
      stripe->stripe_mutex->UnLock();
      // Signal waiting threads to retry locking
      stripe->stripe_cv->NotifyAll();
    }

    rocksdb lock整体结构如下:

    如果一个事务需要锁住大量记录,rocksdb 锁的实现方式可能要比innodb 消耗更多的内存,innodb 的锁结构如下图所示:

    由于锁信息是常驻内存,我们简单分析下RocksDB锁占用的内存。每个锁实际上是unordered_map中的一个元素,则锁占用的内存为key_length+8+8+1,假设key为bigint,占8个字节,则100w行记录,需要消耗大约22M内存。但是由于内存与key_length正相关,导致RocksDB的内存消耗不可控。我们可以简单算算RocksDB作为MySQL存储引擎时,key_length的范围。对于单列索引,最大值为2048个字节,具体可以参考max_supported_key_part_length实现;对于复合索引,索引最大长度为3072个字节,具体可以参考max_supported_key_length实现。

    假设最坏的情况,key_length=3072,则100w行记录,需要消耗3G内存,如果是锁1亿行记录,则需要消耗300G内存,这种情况下内存会有撑爆的风险。因此RocksDB提供参数配置rocksdb_max_row_locks,确保内存可控,默认rocksdb_max_row_locks设置为1048576,对于大部分key为bigint场景,极端情况下,也需要消耗22G内存。而在这方面,InnoDB则比较友好,hash表的key是(space_id, page_no),所以无论key有多大,key部分的内存消耗都是恒定的。InnoDB在一个事务需要锁大量记录场景下是有优化的,多个记录可以公用一把锁,这样也间接可以减少内存。

    总结

    RocksDB 事务锁的实现整体来说不复杂,只支持行锁,还不支持gap lock ,锁占的资源也比较大,可通过rocksdb_max_row_locks 限制事务施加行锁的数量。

    网易轻舟微服务,提供分布式事务框架GTXS,支持跨服务事务、跨数据源事务、混合事务、事务状态监控、异常事务处理等能力,应用案例:工商银行

    展开全文
  • 深入研究数据库内核相关技术,设计并实现数据库管理系统 深入了解数据库应用的业务需求,主导设计不同数据库架构的应用软件,并持续优化 根据业务需求设计数据库逻辑和物理模型, 开发数据库生产环境所需要的存储过程...

    数据库开发工程师

    主要职责

    • 深入研究数据库内核相关技术,设计并实现数据库管理系统
    • 深入了解数据库应用的业务需求,主导设计不同数据库架构的应用软件,并持续优化
    • 根据业务需求设计数据库逻辑和物理模型, 开发数据库生产环境所需要的存储过程、函数、脚本等
    • 参与数据库生产环境的问题优化和解决
    • 探索、研究新的数据库架构发展方向

    工作内容

    数据库开发工程师的日常工作是设计、开发数据库系统和数据库应用软件,因此与软件研发的过程一样,会覆盖需求、设计、编程和测试四个阶段:

    • 需求:深入调研用户市场需求,认清项目的应用场景,解决的问题,性能指标等,需要与数据库系统使用方反复沟通,确定具体的需求。
    • 设计:根据收集整理的需求文档设计数据库系统软件的模型和架构,划分模块分别进行概要和详细设计。
    • 编程:按照模块分工和设计文档,进行编码和调试。
    • 测试:将开发完成的数据库系统交给测试人员进行测试,主要使用的测试方法有黑盒测试、白盒测试、压力测试、性能测试等,测试全部通过后即可等待发布。

    当数据库系统软件完成发布后,数据库开发工程师还需要跟进具体的生产环境使用情况,参与具体问题的改进和优化,提供解决方案。

    技能要求

    1. 通用基础技能要求

    1)精通一种常用编程语言(C/C++、JAVA、PHP等),了解主流的框架、库使用和原理
    2)深入了解计算机数据结构和算法设计,具备Linux操作系统基础知识
    3)掌握基本的网络编程知识,熟悉多线程编程及其技巧
    4)熟练掌握Linux、web server、数据库、缓存相关技术的使用,了解内部实现机制为最优
    5)掌握数据库基本原理和知识,熟悉SQL语法规则和特点
    6)有开源数据库(MySQL、PostgreSQL等)研究和开发经验

    2. 高阶要求

    1)熟练掌握分布式系统理论并有着大量实践
    2)开源社区成员,为开源软件提交过patch
    3)精通Linux系统IO、锁等调优技术

    3. 软素质要求

    1)有良好的英语阅读能力,能够阅读英文资料
    2)自我驱动,主动的学习能力和较强的动手能力
    3)工作认真细致,有责任心,勤奋踏实,善于思考问题
    4)有时间观念,独立性强,沟通能力好,具有团队合作精神

    职业发展

    人才来源

    数据库开发工程师的人才来源可以分为2个方面:应届毕业生和社招。

    • 1)应届毕业生:对于应届毕业生来说,要想成长为数据库开发工程师需要具备一些软件研发方面的技能,同时对数据库理论基础有一定了解,对于数据库管理系统有一些实践经验,再加上较好的主动性、工作认真细致、具有团队合作精神即可;
    • 2)社招:社会招聘主要可以从软件研发和DBA两个方面来筛选人才。对于之前从事大型分布式软件系统研发的工程师,比较容易转型为数据库开发工程师,只需要熟悉一些数据库架构和理论基础即可。而对于DBA来说,已经拥有大量的数据库运维经验,对于数据库研发工作非常有帮助,此时再需要掌握一定的代码编写能力和分布式计算的基础,即可转型成为数据库开发工程师。
    展开全文
  • 阿里巴巴数据库2021届校园招聘PolarDB数据库内核开发工程师(C/C++) 工作地点为杭州 团队介绍: 数据库产品事业部承载着阿里巴巴的所有数据库产品。通过服务于海量用户、数十万数据库实例的产品级系统实践,我们...

    阿里巴巴2021届毕业生暑期实习内推
    联系邮箱:zhuodao.zwj@alibaba-inc.com
    招聘岗位:

    • 阿里巴巴数据库2021届校园招聘PolarDB数据库内核开发工程师(C/C++)
    • 工作地点为杭州

    团队介绍:
    数据库产品事业部承载着阿里巴巴的所有数据库产品。通过服务于海量用户、数十万数据库实例的产品级系统实践,我们逐步凝练出团队特有的具备高度创新的系统级先进技术。PolarDB是我们最核心的自研云数据库产品,技术上具有对其他厂商的代差优势。PolarDB采用存储计算分离、多节点集群架构,节点间采用实时内存复制技术,具有超高的可靠性、可用性,支持Serverless;使用RDMA+25G网络,存储采用创新的Parallel-Raft三副本协议,数据链路全用户态,性能澎湃。从DB层到存储层我们在全链路上做了大量创新,基于这些创新,近年来每年团队在VLDB、SIGMOD等数据库顶级会议上均有独立科研文章发表,同时也为开源社区贡献了大量代码。

    岗位要求:

    • 算法和编程能力、项目经验、在校成绩有一项或多项比较突出
    • 掌握一门编程语言(种类不限),有良好编程功底
    • 对做底层技术比较感兴趣,有志于毕业后在阿里从事数据库内核工作
    • 计算机及相关专业,博士、硕士、本科生均可
    展开全文
  • 本文由云+社区发表本文作者:孙旭,腾讯数据库开发工程师,9年数据库内核开发经验;熟悉数据库查询处理,并发控制,日志以及存储系统;熟悉PostgreSQL(Greenplum,PGXC等)、Teradata等数据库内核实现机制。 ...
  • 做Linux系统开发正处于整个Linux开发中间层,没有上层的C/C++业务和数据库的开发经验,也没有底层的内核和驱动开发经验,到底路该如何走……基于对Linux系统开发的理解和内核的兴趣,认为选择Linux内核开发更适合...
  • 查询优化器是关系数据库系统的核心模块,是数据库内核开发的重点和难点,也是衡量整个数据库系统成熟度的“试金石”。 查询优化理论诞生距今已有四十来年,学术界和工业界其实已经形成了一套比较完善的查...
  • 从事MySQL内核开发工作8年,具有丰富的优化经验;在分布式存储等领域有较丰富经验。 MYSQL数据库适用场景广泛,相较于Oracle、DB2性价比更高,Web网站、日志系统、数据仓库等场景都有MYSQL用...
  • 译者:Aceking,极数云舟技术合伙人,数据库内核研发专家,负责企业级云原生数据库ArkDB等核心数据库产品,华中科技大学计算机系数据库方向研究生毕业,原达梦数据库产品研发工程师,负责达梦数据库内核开发,长期...
  • 嵌入式软件开发工程师成长历程

    千次阅读 2014-08-02 21:58:07
    嵌入式软件开发工程师成长历程  这些日子我一直在写一个实时操作系统内核,已有小成了,等写完我会全部公开,希望能 够为国内IT的发展尽自己一份微薄的力量。最近看到很多学生朋友和我当年一样没有方向 ,所以...
  • 一个测试开发工程师的自我修养 欢迎 时间飞逝,转眼间已经工作四年左右了。 还记得刚毕业第一年时,还维护了一个个人博客主页,定期记录一些学习笔记和心得体会,但是却工作越来越忙,近几年总结的文章已经越来越少...
  • 招聘岗位:阿里巴巴数据库2021届校园招聘PolarDB数据库内核开发工程师(C/C++)- 工作地点为杭州,深圳,北京均可。 内推邮箱: zhuodao.zwj@alibaba-inc.com 团队介绍:数据库产品事业部承载着阿里巴巴的所有数据库...
  • 导语:窦贤明,花名执白,阿里资深研发工程师,参与过PostgreSQL与Greenplum的内核源码维护、开发,以及云上自动化服务之类的工作。 窦贤明认为,支持类型、功能和语法丰富,性能优良 9月24日,窦贤明将参加...
  • 系统内核对象,MFC链接库,串口程序开发,网络程序开发,Internet程序开发,程序调试与异常处理,Visual C++ 2005介绍,C++托管扩展编程等。书中各部分内容由浅入深,逐步让读者掌握MFC编程的知识、方法和技巧,是...
  • 1.今日头条:广告模型后台开发工程师,存储引擎研发工程师,服务端(高级)工程师,服务端开发工程师-大数据方向,大数据平台高级...2.华为:数据库内核开发,嵌入式软件开发,paas软件开发工程师 数据库内核开发 ...
  • 转.我在MySQL的那些年

    2020-12-31 17:54:26
    Allen Lai) 前MySQL官方团队成员,专注数据库内核开发近二十年,先后就职于达梦,Teradata,北大方正以及MySQL InnoDB存储引擎团队,是达梦数据库内核,方正XML数据库,以及MySQL InnoDB的GIS支持,透明加密功能的...
  • Mysql内核深度优化

    千次阅读 2016-10-27 20:01:40
    从事mysql内核开发工作8年,具有丰富的优化经验;在分布式存储等领域有较丰富经验。 早期的CDB主要基于开源的Oracle MySQL分支,侧重于优化运维和运营的OSS系统。在腾讯云,因为用户数的不断增加,对CDB for
  • 简怀兵,腾讯云数据库高级工程师,负责腾讯云 CDB 内核及基础设施建设,从事 MySQL 内核开发工作 8 年,具有丰富的优化经验;在分布式存储等领域有丰富经验。 TxSQL,是腾讯 CDB(Cloud Database 云数据库)的...
  • MySQL数据库--架构介绍

    2020-06-22 16:21:00
    mysql内核 sql优化工程师 mysql服务器的优化 各种参数常量设置 查询语句优化 主从复制 软硬件升级 容灾备份 sql备份 ​ 2.Linux版的安装 安装 下载 选择 GA稳定版 client 和 server 都需要下载 第三方软件安装在opt...
  • 欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯云数据库团队 发表于云+社区专栏 ...从事MySQL内核开发工作8年,具有丰富的优化经验;在分布式存储等领域有较丰富经验。 MYSQL数据库适...

空空如也

空空如也

1 2 3 4 5 6
收藏数 110
精华内容 44
热门标签
关键字:

数据库内核开发工程师