专栏首页美团技术团队数据库运维必读的10个问题

数据库运维必读的10个问题

本文中的问题精选自上期【你问我答】——数据库专题中读者的提问。【你问我答】是由美团点评技术团队推出的线上问答服务,你在工作学习中遇到的各种技术问题,都可以通过我们微信公众号发问,我们5000+工程师会义务为你解答,欢迎大家踊跃提问。高质量、定义清晰的问题会优先获得解答。

Q1:能不能推荐几本关于SQL的书籍。谢谢!谢谢!

A:推荐图灵出的《SQL必知必会(第4版)》,这也是Amazon上最畅销的SQL图书的中文版,写得很明快,概念非常清楚。这本书用来学习关系型数据库也很不错,至少基本概念比大部头的教材说得清楚得多。 如果你英语好,这些网上的教程也不错: https://www.sqlteaching.com/ http://www.w3schools.com/sql/default.asp

Q2:我想问一下,这么些数据库,有关系的,比如MySQL,也有非关系的Redis、MongoDB这些引擎的底层实现、应用场景?

A:底层实现这个话题比较大,我主要说场景吧。 MySQL是关系型数据库,支持事务、支持索引、二级索引、MVCC,支持SQL、join,存储结构化数据、写入比较昂贵,并且从库同步单一线程,所以容易造成延迟,适合读多写少的OLTP业务。 Redis、MongoDB属于非关系型的NoSQL数据库,KV存储。Redis有丰富的数据结构,Remote Dictionary Server,支持Hash查找,可以自己构造二级索引,由于它主要定位于内存查询,所以适合对响应时间要求极高、数据规模可以预见、热点数据比较集中、不存在冲突的场景,与Lua结合实现秒杀,但不适合大批量导入数据、数据量较大的业务。MongoDB支持单文档事务,可自动故障切换,比较容易扩展分片,适合数据量大场景。

Q3:美团点评如何优化数据库才能保持高性能呢? SQL优化方式是什么呢?

A:放两篇之前的技术博客 索引原理以及慢查询优化: https://tech.meituan.com/mysql-index.html SQL优化工具:https://tech.meituan.com/sqladvisor_pr.html

优先基于开源box/Anemometer有一套慢查询系统,然后每个业务线会定期有慢查询报表,同时我也有一套开源SQL Advisor工具进行优化。

Q4:能不能简单介绍下时序数据库的应用场景,和其它NoSQL数据库有啥区别?

A:时序数据是基于时间的一系列数据,传统数据库仅仅记录了数据的当前值(虽然会有快照读),时序数据库则记录了所有的历史数据,它可以用于趋势预测,根据历史进行大数据分析,实现预测等场景。它和NoSQL其实是两个维度的产品,它比较适合LSM tree数据结构,该数据结构普遍用于NoSQL中。

Q5:TiDB对标的是Spanner,它们对于像select from order by key limit offset 100这样的实现思路是怎样的?因为,它们具有sharding , 如果这个key不是分区建?那么下推,转换成top offset+100然后merge sort?是这样实现的吗?或者还有什麽黑科技?

A:这个问题,我的理解和你基本一致。如果该key无索引的情况下,最差的方式是全部下推到各个节点进行查询,然后merge;如果有索引的话,有可能根据会根据该节点该索引最大最小值先进行判断,然后进行提前过滤掉,不过这个我不是很确定,我后面和TiDB的同学沟通下再答复。

Q6:数据库以及SQL优化的方案有哪些?

A:分几个层面: 1. 系统层面:纵向扩展数据库服务器配置,简单粗暴。 2. 数据库服务端层面:配置参数调优等,比如调整数据库连接缓冲区大小。 3. 架构层面:如果当前是单实例架构,或多实例垂直架构,根据应用特点,可以考虑升级架构,如常见的主从架构等。 4. 库表层面:可以考虑分库分表。表的拆分,根据业务特点,可考虑水平拆分或垂直拆分。 5. SQL层面:这个最常见有效,对开发来讲,经常用到。具体到设计表的设计,索引的设计是否合理;对于DML语句,使用命令explain查看执行计划,根据执行计划的结果进行分析调优。

Q7:请问MySQL分表和分区各自的优缺点是什么?分别适用于什么场景,谢谢~

A:先说分区表,其实MySQL的分区表适用的场景比较有限和苛刻,首先要最大程度满足分区裁剪,即查询条件需要有分区字段,否则全表扫描性能就不可控,即时索引扫描,因为MySQL的分区表索引都是local,没有全局索引。分区表在数据清理,归档上会很友好,所以我们这边主要用于诸如log类的有很好分区维度(时间),并且历史数据是静态数据,或者有定期归档删除需求的场景。分表的目的是避免表太大导致的索引高度变大、表查询性能下降,为了性能可以损失一些易用性的场景,比如SQL需要更简单,聚合操作需要在业务层实现。 分库分表的实践之前我们也发表过两篇文章,可以参考: 大众点评订单系统分库分表实践 MTDDL——美团点评分布式数据访问层中间件

Q8:水平拆分,后期“表结构一致性”如何验证?然后就是合并查询是应用层实现的吗?

A:表结构一致这个验证其实在美团点评的需求比较低,因为我们在权限、流程会避免只在某一个节点进行DDL,另外check起来的方案也比较容易,比如直接在多节点对比schema_info.tables就可以。合并查询我们这边会Zebra(JDBC连接池的proxy)进行处理,不过有一定局限性。

Q9:现在业界MySQL Binlog同步使用Paxos的有开源的实现吗?MySQL Proxy前端负载均衡路由/代理能够灵活地支持prepare语句或者复杂的join多表查询吗?

A:Binlog同步Paxos实现,没太明白这个问题,MySQL官方的MGR就是Paxos实现的。 美团点评的Proxy就是Atlas,如果是非分库分表的话,支持表多表join,如果是分库分表的话,限制就很多了,如下:

  • 分库分表限制
    1. 分库分表列仅支持整形(int和int64)。
    2. 仅支持select、insert、replace、delete和update。
    3. Insert操作,如果没有显式的指定列名,则会按照value list的第一个值来计算。比如Insert values(c1,c2,c3),则按照c1来计算分库分表。
    4. 不支持 INSERT INTO tbl SET col = xxx,INSERT INTO tbl SELECT * FROM xxx 形式。
    5. update修改分库分表字段的值时,只会修改值,不会根据修改后的值再对数据进行迁移。
    6. 不支持跨库查询的Limit、Sort、Group by和Union操作。目前Atlas只是简单合并转发后台的结果集。
    7. 不支持分库分表的表中含有自增列。
    8. 不支持join语句中含有多个分表,因为Atlas无法同时替换语句中的多张表。如果含有多个分库表,则分库规则必须一致,否则可能结果错误。
    9. 不支持分表名出现在表达式中,比如select shard_table.col + 1 from shard_table where shard_table.shard_col = xxx,因为其中的表达式不支持表名替换;分库仍然支持。
    10. 不支持targetlist中有函数。
    11. 不支持 sharding 表出现在 FROM 语句的子查询中,例如 SELECT * FROM (SELECT * FROM tbl_sharding) as a;(目前的 rewrite 机制不支持子查询)。
    12. 不支持SQL_CALC_FOUND_ROWS语句。
  • 后台DB连接池带来的限制

不支持cursor、prepare等功能。

Q10:什么是前置库,该如何配置呢?

A:在数据库范畴里,貌似并没有前置库这个概念。但我猜测是不是大数据里数据来源库?如果是MySQL的话,我们会普遍使用对Binlog进行解析,这样对源库的影响很小,并且可以支持增量同步,解析的工具开源的很多,比如在美团点评就有三个canal、databus、pumer,地址自己搜一下吧。(有可能答非所问) (小编特别提醒:提问的时候,问题一定要说清楚背景,不然我们专家也难为无米之炊哦)

本文分享自微信公众号 - 美团点评技术团队(meituantech),作者:数据库天团

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2017-09-21

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 美团DB数据同步到数据仓库的架构与实践

    本文主要从Binlog实时采集和离线处理Binlog还原业务数据两个方面,来介绍如何实现DB数据准确、高效地进入数仓。

    美团技术团队
  • 美团点评业务风控系统构建经验

    背景 美团最初以团购的形式出现,到现在有了很大的业务形态转变。尤其是经过与大众点评的业务融合,从单一业务发展成了覆盖到店餐饮、到店综合、猫眼、外卖、酒店、旅游等...

    美团技术团队
  • 美团DB数据同步到数据仓库的架构与实践

    在数据仓库建模中,未经任何加工处理的原始业务层数据,我们称之为ODS(Operational Data Store)数据。在互联网企业中,常见的ODS数据有业务...

    美团技术团队
  • “分库分表" ?选型和流程要慎重,否则会失控

    恭喜你,贵公司终于成长到一定规模,需要考虑高可用,甚至分库分表了。但你是否知道分库分表需要哪些要素?拆分过程是复杂的,提前计划,不要等真正开工,各种意外的工作接...

    xjjdog
  • Mysql入门的10条语句

    1.查看当前服务器下面,有那些库(database)?

    思梦php
  • sql server 2008 基础知识

    一、配置管理器 1.管理服务   使用配置管理器可以启动、停止、重新启动、继续或暂停服务。   服务器和客户端网络协议 2.SQLSMS   简介:SQLSMS...

    欠扁的小篮子
  • 数据库敏捷版本控制之3个数据库策略

    关于数据库的版本控制前段时间一直没找到特别好的方式,通过思考和不断实践,最近总结了一个不错的方法,特分享给大家

    麦克-堂
  • eclipse如何导入、运行Java web项目

    在平时的学习与工作中,我们经常会参考一些开源项目,但是我们经常会遇到下载下来后无法运行的情况,一般开源项目都是经过很多人验证的,项目本身是不会有问题的,问题在于...

    小诸葛
  • Oracle 12.2新特性掌上手册 - 第六卷 ADG的性能与诊断

    编辑手记:在Oracle 12.2中,ADG有许多惊人的改进,通过ADG standby数据库的性能数据收集和诊断、快照standby数据库的应用,以及实时的数...

    数据和云
  • 开放的计算能力为数据库瘦身

    开放的计算能力为数据库瘦身 计算封闭性导致臃肿的数据库 我们在上一期谈到,数据库的臃肿,也就是过多的中间表以及相关存储过程,是由于其计算封闭性造成的。如果能够实...

    企鹅号小编

扫码关注云+社区

领取腾讯云代金券