数据库运维必读的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)

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

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

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏沃趣科技

Oracle数据库12cR2版本的SQL计划管理

文章翻译自ORACLE WHITE PAPER SQL Plan Management with Oracle Database 12c Release 2 概...

35010
来自专栏CDA数据分析师

【干货】大数据量下,58同城mysql实践!

WOT(World Of Tech)2015,互联网运维与开发者大会将在北京举行,会上58同城将分享《大数据量下,58同城mysql实战》的主题,干货分享抢先看...

2479
来自专栏杨建荣的学习笔记

SQL审核工具SQL Advisor简单体验

现在的很多大公司,都喜欢招丰富经验的人,从公司的角度来说,能把当前的事务性工作解决了,在这个基础上能够把你的理解和知识沉淀下来,那是极好的,说通俗一些,算是吸...

1592
来自专栏数据和云

SQL之美 - Oracle 子查询优化系列精讲

题记:SQL优化及SQL审核,是从源头解决性能问题的根本手段,无论是开发人员还是DBA,都应当持续深入的学习SQL开发技能,从而为解决性能问题打下根基。 本系列...

3293
来自专栏FreeBuf

经验分享:社会工程学数据库搭建TIPS

最近一直在搞社工库的搭建。网上这方面也有很多文章,但是很少涉及到细节,在此与大家分享一些个人心得。 测试环境 测试坏境:windows server 2012...

2338
来自专栏IT派

如何用Python 编写知乎爬虫?So easy!

在爬虫系统中,待抓取 URL 队列是很重要的一部分。待抓取 URL 队列中的 URL 以什么样的顺序排列也是一个很重要的问题,因为这涉及到先抓取那个页面,后抓取...

1290
来自专栏带你撸出一手好代码

sql连接查询中on筛选与where筛选的区别

sql查询这个东西, 要说它简单, 可以很简单, 通常情况下只需使用增删查改配合编程语言的逻辑表达能力,就能实现所有功能。 但是增删查改并不能代表sql语句的所...

3408
来自专栏杨建荣的学习笔记

SQL Monitor,你值得掌握的一个特性(r10笔记第29天)

对于线上的SQL语句,看着执行计划cost还不错,但是实际执行的时候效果却有千壤之别,这是为什么呢? 对于一个庞大的SQL语句,看着得到的执行计...

3547
来自专栏大数据平台TBDS

spark sql简单查询千亿级库表导致的问题

根据常理判断,简单的 select * limit 不会造成内存溢出的。因此,我们用hive原生sql查询,发现不存在这个问题。

3762
来自专栏杨建荣的学习笔记

通过top命令抓取cpu高消耗的sql (44天)

top命令在linux环境维护中很实用,虽然功能缺失不够sar那么全面。今天和大家分享一个通过top命令来抓取性能sql的案例。 通过top命令抓取了如下的信息...

3826

扫码关注云+社区