BTree

超级全面的MySQL优化面试解析-2018【精】

萝らか妹 提交于 2019-11-29 07:29:08
推荐阅读(点击即可跳转阅读) SpringBoot内容聚合 面试题内容聚合 设计模式内容聚合 Mybatis内容聚合 多线程内容聚合 本文概要 概述 为什么要优化 系统的吞吐量瓶颈往往出现在数据库的访问速度上 随着应用程序的运行,数据库的中的数据会越来越多,处理时间会相应变慢 数据是存放在磁盘上的,读写速度无法和内存相比 如何优化 设计数据库时:数据库表、字段的设计,存储引擎 利用好MySQL自身提供的功能,如索引等 横向扩展:MySQL集群、负载均衡、读写分离 SQL语句的优化(收效甚微) 字段设计 字段类型的选择,设计规范,范式,常见设计案例 原则:尽量使用整型表示字符串 存储IP INET_ATON(str) ,address to number INET_NTOA(number) ,number to address MySQL内部的枚举类型(单选)和集合(多选)类型 但是因为维护成本较高因此不常使用,使用 关联表 的方式来替代 enum 原则:定长和非定长数据类型的选择 decimal不会损失精度,存储空间会随数据的增大而增大。double占用固定空间,较大数的存储会损失精度。非定长的还有varchar、text 金额 对数据的精度要求较高,小数的运算和存储存在精度问题(不能将所有小数转换成二进制) 定点数decimal price decimal(8,2)

【从二叉树到红黑树】清晰理解红黑树的演变---红黑的含义

夙愿已清 提交于 2019-11-29 06:25:51
网上关于红黑树的博文很多,但是多是上来即讲定义,未说其所以然,难以理解且无所营养,甚者示例图有误且概念模糊的比比即是; 由于最近在学习相关知识找到一篇较为透彻且深入剖析的博文特此转载修订 注:原文示例图中有所错误本文中已重新修正,并增加了红黑树相关部分更多内容 前言 红黑树,对不少人来说是个比较头疼的名字,在网上搜资料也很少有讲清楚其演变来源的,多数一上来就给你来五条定义,红啊黑啊与根节点距离相等之类的,然后就开始进行旋转、插入、删除这些操作。一通操作下来,连红色和黑色怎么来的,是什么含义,有什么作用都云里雾里的,能搞清楚就怪了。 本文介绍红黑树,暂时不涉及任何代码,只是帮助你理解红黑树的演变来源,树结构中红黑色具体含义,保证你理解了过后,再去看什么旋转插入的东西,要清晰得多。换句话说,理解本文要描述的内容是从代码级理解红黑树的基础。 开始之前,我还是恳请你保持耐心,一步一步仔细看完,浮躁的话真的做不好任何事情。 正文 红黑树的起源,自然是二叉查找树了,这种树结构从根节点开始, 左子节点小于它,右子节点大于它 。每个节点都符合这个特性,所以易于查找,是一种很好的数据结构。但是它有一个问题,就是容易偏向某一侧,这样就像一个链表结构了,失去了树结构的优点,查找时间会变坏。 所以我们都希望树结构都是矮矮胖胖的,像这样: 而不是像这样: 在这种需求下,平衡树的概念就应运而生了。

技术分享 | 优化 InnoDB 的主键

倖福魔咒の 提交于 2019-11-29 06:25:28
作者:Yves Trudeau 翻译:管长龙 前言 作为 Percona 的首席架构师,我的主要职责之一是对客户的数据库进行性能方面的优化,这使得工作复杂且非常有趣。在这篇文章中,我想讨论一个最重要的问题: 选择最佳的 InnoDB 主键 。 InnoDB 主键有什么特别之处? InnoDB 被称为索引组织型的存储引擎。主键使用的 B-Tree 来存储数据,即表行。这意味着 InnoDB 必须使用主键 。如果表没有主键,InnoDB 会向表中添加一个隐藏的自动递增的 6 字节计数器,并使用该隐藏计数器作为主键。InnoDB 的隐藏主键存在一些问题。您应该始终在表上定义显式主键,并通过主键值访问所有 InnoDB 行。 InnoDB 的二级索引也是一个B-Tree。搜索关键字由索引列组成,存储的值是匹配行的主键。通过二级索引进行搜索通常会导致主键的隐式搜索。 什么是 B-Tree? 一个 B-Tree 是一种针对在块设备上优化操作的数据结构。块设备或磁盘有相当重要的数据访问延迟,尤其是机械硬盘。在随机位置检索单个字节并不比检索更大的数据花费的时间更少。这是 B-Tree 的基本原理,InnoDB 使用的数据页为 16KB。 让我们尝试简化 B-Tree 的描述。B-Tree 是围绕这键来组织的数据结构。键用于搜索 B-Tree 内的数据。B-Tree 通常有多个级别

工作中遇到的99%SQL优化,这里都能给你解决方案

时光怂恿深爱的人放手 提交于 2019-11-29 05:40:18
前几篇文章介绍了mysql的底层数据结构和mysql优化的神器explain。后台有些朋友说小强只介绍概念,平时使用还是一脸懵,强烈要求小强来一篇实战sql优化,经过周末两天的整理和总结,sql优化实战新鲜出炉, 大家平时学习和工作中,遇到的90% 的sql优化都会介绍到,介意篇幅过长,分成3篇文章哈。 CREATE TABLE `employees` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(24) NOT NULL DEFAULT '' COMMENT '姓名', `age` int(20) NOT NULL DEFAULT '0' COMMENT '年龄', `position` varchar(20) NOT NULL DEFAULT '' COMMENT '职位', `hire_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '入职时间', PRIMARY KEY (`id`), KEY `idx_name_age_position` (`name`,`age`,`position`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8

mysql索引结构

本秂侑毒 提交于 2019-11-29 04:04:18
索引是帮助mysql高效获取数据的排好序的数据结构; 索引数据结构 select * from A where col1= 6; 二叉树 :容易单边增长,从根节点开始查找次数多,不适合 红黑树 :树高度不合适,大数据量,从根节点开始查找次数多,不适合 Hash表 : 对 col1= 6进行hash,获取到磁盘地址指针。但是col1> 6时(不支持范围查找),就会全表扫描, 不适合 ; B-tree :索引结构 https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 红黑树(平衡二叉树),自旋平衡的过程 来源: https://my.oschina.net/u/3915790/blog/3101088

javascript实现二叉树

≯℡__Kan透↙ 提交于 2019-11-28 22:50:27
<script type="text/javascript"> //javascript实现属性结构 //相当于用于创建结点 (function(window){ function Btree(str){ this.leftheight = null; this.rightheight = null; this.leftCountNode = null; this.rightCountNode = null; this.ChildNode = null; //保存树的高度 this.height = null; //保存树的结点 this.countNode = null; this.struct = null; //构建树 this.createTree(str); //获取输的信息 this.init(this.struct); }; Btree.prototype = { BtreeNode:function(){ this.left = null; this.right = null; this.data = null; }, createTree:function(str){ var Btree = null;//一个空二叉树 var arr = [];//用一个数组表示栈 var top = 1;//指向栈底 var p = null; var k; Btree = p

mysql索引优化

怎甘沉沦 提交于 2019-11-28 15:03:32
作为免费又高效的数据库,mysql基本是首选。良好的安全连接,自带查询解析、sql语句优化,使用读写锁(细化到行)、事物隔离和多版本并发控制提高并发,完备的事务日志记录,强大的存储引擎提供高效查询(表记录可达百万级),如果是InnoDB,还可在崩溃后进行完整的恢复,优点非常多。即使有这么多优点,仍依赖人去做点优化,看书后写个总结巩固下,有错请指正。   完整的mysql优化需要很深的功底,大公司甚至有专门写mysql内核的,sql优化攻城狮,mysql服务器的优化,各种参数常量设定,查询语句优化,主从复制,软硬件升级,容灾备份,sql编程,需要的不是一星半点的知识与时间来掌握,作为一名像俺这样的菜鸟开发,强吃这么多消化不了也没意义:没地儿用啊,况且还有运维和dba,还不如把手头的业务写好,也就是写好点的sql,而且很多sql语句优化跟索引还是有很大关系的。   首先,mysql的查询流程大致是:mysql客户端通过协议与mysql服务器建立连接,发送查询语句,先检查查询缓存,如果命中,直接返回结果,否则进行语句解析,有一系列预处理,比如检查语句是否写正确了,然后是查询优化(比如是否使用索引扫描,如果是一个不可能的条件,则提前终止),生成查询计划,然后查询引擎启动,开始执行查询,从底层存储引擎调用API获取数据,最后返回给客户端。怎么存数据、怎么取数据,都与存储引擎有关。然后

必看!如何让你的LBS服务性能提升十倍!

左心房为你撑大大i 提交于 2019-11-27 14:46:10
本文由云+社区发表 作者:腾讯云数据库团队 随着国内服务共享化的热潮普及,共享单车,共享雨伞,共享充电宝等各种服务如雨后春笋,随之而来的LBS服务定位问题成为了后端服务的一个挑战。MongoDB对LBS查询的支持较为友好,也是各大LBS服务商的首选数据库。腾讯云MongoDB团队在运营中发现,原生MongoDB在LBS服务场景下有较大的性能瓶颈,经腾讯云团队专业的定位分析与优化后,云MongoDB在LBS服务的综合性能上,有10倍以上的提升。 腾讯云MongoDB提供的优异综合性能,为国内各大LBS服务商,例如摩拜单车等,提供了强有力的保障。 LBS业务特点 以共享单车服务为例,LBS业务具有2个特点,分别是时间周期性和坐标分布不均匀。 一.时间周期性 高峰期与低谷期的QPS量相差明显,并且高峰期和低峰期的时间点相对固定。 二.坐标分布不均匀 坐地铁的上班族,如果留意可能会发现,在上班早高峰时,地铁周围摆满了共享单车,而下班 时段,地铁周围的共享单车数量非常少。如下图,经纬度(121,31.44)附近集中了99%以上 的坐标。此外,一些特殊事件也会造成点的分布不均匀,例如深圳湾公园在特殊家假日涌入大量的客户,同时这个地域也会投放大量的单车。部分地域单车量非常集中,而其他地域就非常稀疏。 MongoDB的LBS服务原理 MongoDB中使用2d_index 或2d_sphere

mysql学习(2)索引的本质

泪湿孤枕 提交于 2019-11-27 09:53:11
问题:SQL查询慢怎么办? 优化手段,加索引。 索引是 帮助MYSQL高效的获取数据的 排好序 的 数据结构。 问题:索引结构为什么使用Btree而不使用二叉树,红黑树或者HASH结构? 二叉树的特性,右边子节点的值大于父节点,且左边子节点的值小于父节点 二叉树:使用二叉树来做索引的数据结构,当索引值递增的时候,二叉树也会不断地增加右子节点 ,那么在查找索引的时候,所做的IO操作,等同于没有索引逐行查找数据的IO操作。 红黑树:平衡二叉树。随着数据量增大,树的高度也会变高。2的N次方=数量量(假设100万),那么N至少也是50,那么树的高度也是50,如果数据在子叶节点上,那么至少要经过50次的IO操作,才能找到数据。 HASH:散列表结构,key不适合排序,而且数据是散列的分布的,不利于IO读写。 BTree:一个节点上,横向扩展。即一个节点上,可以存储多个元素(Degree),且每个元素,都可以有子节点,叫做多叉树。 度(Degree)-节点的数据存储个数 叶节点具有相同深度 叶节点的指针为空 节点中的数据KEY从左至右递增排列 以5阶B树举例 B+Tree(Btree变种) 非叶子节点不存储data,只存储key,可以增大度(Degree)-节点的数据存储个数 叶子节点不存储指针 叶子节点增加了顺序访问指针,提高区间访问的性能 以5阶B+树举例 问题:Btree和B

面试官:要不简单聊一下你对MySQL索引的理解?

你离开我真会死。 提交于 2019-11-26 21:49:14
MySQL索引?这玩意儿还能简单聊?明显是在挖坑,幸好老夫早有准备,切听我一一道来。 一、索引是什么? 索引是帮助MySQL高效获取数据的数据结构。 二、索能干什么? 索引非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。 索引能够轻易将查询性能提高好几个数量级,总的来说就是可以明显的提高查询效率。 三、索引的分类? 1、从存储结构上来划分:BTree索引(B-Tree或B+Tree索引),Hash索引,full-index全文索引,R-Tree索引。这里所描述的是索引存储时保存的形式, 2、从应用层次来分:普通索引,唯一索引,复合索引 3、根据中数据的物理顺序与键值的逻辑(索引)顺序关系:聚集索引,非聚集索引。 平时讲的索引类型一般是指在应用层次的划分。 就像手机分类:安卓手机,IOS手机 与 华为手机,苹果手机,OPPO手机一样。 普通索引 : 即一个索引只包含单个列,一个表可以有多个单列索引 唯一索引 : 索引列的值必须唯一,但允许有空值 复合索引 : 多列值组成一个索引,专门用于组合搜索,其效率大于索引合并 聚簇索引(聚集索引) : 并不是一种单独的索引类型,而是一种数据存储方式。具体细节取决于不同的实现,InnoDB的聚簇索引其实就是在同一个结构中保存了B-Tree索引(技术上来说是B+Tree)和数据行。 非聚簇索引 : 不是聚簇索引,就是非聚簇索引