数据库总结-分享

  • 数据存储方案


    image.png
  • 选 SQL 还是 NoSQL
    • 使用sql
      • 需要确保事务,数据结构是不变的
    • 使用nosql
      • 存储大量没有结构的数据
      • 充分利用云计算和存储
        • Nosql 数据 跨多个数据中心进行扩展,不会带来很多麻烦。
      • 快速发展的
        • 两周一个迭代,频繁更新数据结构

NoSQL vs SQL Databases: 6 Important Differences | Upwork

一. Mysql 开发规范

  • 针对内部开发的一系列建议或规则,由DBA制定

1. 规范存在的意义

  • 保证线上数据库 schema 规范

  • 减少出问题概率

  • 方便自动化管理

  • 需要长期坚持规范,这对开发和DBA来说是双赢

2. 为什么有这个规范

  • 很大一部分开发规范都跟 索引实现有关
    • 索引存在意义
      • 假如有 10 亿个不重复的数字, 你要找到其中一个数
        • 直接循环 时间复杂度 O(n) = 10亿 次
        • B+树 时间复杂度接近 O(logn) = 29 次

2.1 InnoDB 索引的实现

  • innoDB 索引使用 B+树实现
  • 建表
CREATE TABLE `workers`
(
    `id`    int AUTO_INCREMENT COMMENT '员工工号'
        PRIMARY KEY,
    `name`  varchar(16) NOT NULL COMMENT '员工名字',
    `sales` int         NULL COMMENT '员工业绩'
) CHARSET = utf8;

INSERT INTO `workers` (`id`, `name`, `sales`) VALUES (1, '江南', 12744);
INSERT INTO `workers` (`id`, `name`, `sales`) VALUES (3, '今何在', 14082);
INSERT INTO `workers` (`id`, `name`, `sales`) VALUES (7, '路明非', 14738);
INSERT INTO `workers` (`id`, `name`, `sales`) VALUES (8, '吕归尘', 7087);
INSERT INTO `workers` (`id`, `name`, `sales`) VALUES (11, '姬野', 8565);
INSERT INTO `workers` (`id`, `name`, `sales`) VALUES (15, '凯撒', 8501);
INSERT INTO `workers` (`id`, `name`, `sales`) VALUES (20, '绘梨衣', 7890);
INSERT INTO `workers` (`id`, `name`, `sales`) VALUES (21, '西泽尔', 16634);
  • 形成索引文件
    • 聚簇索引
      • 怎么划分 聚簇索引 与 非聚簇索引 依据 根据叶子节点的内容
      • 叶子节点存的是整行数据, 索引文件就是数据文件


        image.png
  • 添加一个 索引
alter table workers add index index_name(name);
  • 非聚簇索引 也叫 辅助索引,二级索引
  • 叶子节点存放的是主键的值


    image.png

回表

select * from workers where name='吕归尘';
image.png

覆盖索引

select id,name from workers where name='吕归尘';
image.png

image.png

联合索引 与 最左前缀原则

  • 查询条件有多个,太多字段建立索引,维护索引成本会高
  • 左前缀匹配原则
    • 例如 我要高频 根据 业绩 和 名称 查这个人
alter table workers add index index_sales_name(sales, name);
  • 形成的索引文件
    • 索引项是按照 索引定义里面出现的字段顺序排序的。


      image.png
# 最左前缀原则 这两个都能命中 index_id_name这个索引
SELECT * FROM  `workers` WHERE  `name` = 'xx' AND `sales` = 1;
SELECT * FROM  `workers` WHERE  `sales ` = 1;

# 这个条件 不能命中 index_id_name这个索引
SELECT * FROM  `workers` WHERE  `name` = 'xx';

3. 从 InnoDB 索引层面 不符合规范会有什么问题

  • 表必须有主键(复合主键,无主键需要说明原因),统一使用应用生成的全局唯一id,类型为bigint且单调递增不推荐使用数据库auto_increment。

    • 假如我们 用一个业务唯一 字符串做主键, 例如身份证
    • 问题


      image.png
      • 问题1 因为innoDB 使用聚簇索引,数据记录本身存放在主索引的叶子节点上。同一个叶子节点内(大小为一个内存页或磁盘页) 的各条是按顺序存放的,插入新记录的时候,插入适当的节点和位置,如果达到负载因子(InnoDB默认15%16),则要开辟新的页, 。
        • 如果使用字符串主键 ,主键的值近似于随机,每次插入 都可能移动数据,
          • 目标页可能已经回写到磁盘而从缓存中清除,又要从磁盘中读回来,增加开销
          • 同时频繁的移动,分页造成了大量的碎片,得到不紧凑的索引结构,后续不得不通过 OPTIMIZE TABLE(重新组织 table 数据和关联索引数据的物理存储)
        • 如果是自增主键,每次插入新记录,就会顺序添加到当前索引节点后续位置,页满自动开辟新的一页。
      • 问题2
        • 一个表的非聚簇索引 有很多个。 每个都是一颗B+树,叶子节点都是 主键值
          • 主键长度越小,普通索引叶子节点就越小,普通索引占用空间就小。
          • 当是 bigint 就是 8字节,当是 字符串 远远大于8字节


            image.png
  • 禁用default NULL,业务上也尽量不使用NULL值。字符串默认值可用default ''代替,数值可用default 0代替

    • 可以为NULL的列, 使得索引,索引统计和值比较都变复杂
      • 需要使用 ISNULL()来判断是否为 NULL 值。
        • NULL 与任何值的直接比较都为 NULL。
    • 可以为NULL的列,每个索引需要一个额外的字节。


      image.png
  • 表必备3个字段:id,create_time,modify_time。说明:id必为主键,类型为unsigned bigint,单调递增。create_time,modify_time类型均为datetime(时间字段为了追溯数据的变化)

  • Timestamp 时区有关
    • ‘1970-01-01 00:00:00’到现在的毫秒数, 最大值到 2038年 , 可能又是一个千年虫问题
    • 精确到秒 是 4字节, 精确到毫秒 是 7字节。
  • DateTime 时区无关
    • 不管保留几位毫秒数 都是8字节

二 资料总结

博客:

CodingLabs - MySQL索引背后的数据结构及算法原理

NoSQL vs SQL Databases: 6 Important Differences | Upwork

书籍:

《高性能 MySQL》

适合 dba 和 开发

《MySQL 技术内幕:InnoDB 存储引擎》

想了解内部原理

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,941评论 6 508
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,397评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 165,345评论 0 356
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,851评论 1 295
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,868评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,688评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,414评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,319评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,775评论 1 315
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,945评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,096评论 1 350
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,789评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,437评论 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,993评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,107评论 1 271
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,308评论 3 372
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,037评论 2 355

推荐阅读更多精彩内容