BTree

数据库优化方法整理(开发人员实用)

怎甘沉沦 提交于 2020-04-06 17:24:21
特别说明: 本文只是面对数据库应用开发的程序员,不适合专业 DBA ,DBA 在数据库性能优化方面需要了解更多的知识; 本文许多示例及概念是基于 Oracle 数据库描述,对于其它关系型数据库也可以参考,但许多观点不适合于 KV 数据库或内存数据库或者是基于 SSD 技术的数据库; 本文未深入数据库优化中最核心的执行计划分析技术。 读者定位: 开发人员:如果你是做数据库开发,那本文的内容非常适合,因为本文是从程序员的角度来谈数据库性能优化。 架构师:如果你已经是数据库应用的架构师,那本文的知识你应该清楚 90% ,否则你可能不是一个喜欢折腾的架构师。 DBA(数据库管理员):大型数据库优化的知识非常复杂,本文只是从程序员的角度来谈性能优化,DBA除了需要了解这些知识外,还需要深入数据库的内部体系架构来解决问题。 前言 在网上有很多文章介绍数据库优化知识,但是大部份文章只是对某个一个方面进行说明,而对于我们程序员来说这种介绍并不能很好的掌握优化知识,因为很多介绍只是对一些特定的场景优化的,所以反而有时会产生误导或让程序员感觉不明白其中的奥妙而对数据库优化感觉很神秘。 很多程序员总是问如何学习数据库优化,有没有好的教材之类的问题。在书店也看到了许多数据库优化的专业书籍,但是感觉更多是面向 DBA 或者是 PL/SQL 开发方面的知识,个人感觉不太适合普通程序员

MySQL 21道高频面试题及其解析

醉酒当歌 提交于 2020-04-05 15:02:30
Q1:MySQL主要有哪些存储引擎,分别适合哪些应用场景? 答:主要有①MyISAM,是5.5版本之前的默认存储引擎,支持表级锁,不支持事务和外键,并发效率较低,读取数据快,更新数据慢。适合以读操作为主,并且对并发性要求较低的应用。②InnoDB,MySQL目前的默认存储引擎,支持行级锁、事务和外键,并发效率好。适合对事务的完整性和并发性、数据的准确性要求比较高,增删操作多的应用。③Memory,所有的数据都保存在内存中,访问速度快,一旦服务关闭数据将丢失。适合更新不太频繁的数据量小的表用来快速得到访问结果。④Archive、Federated等。 Q2:索引是什么? 答:MySQL官方对索引的定义为:索引(index)是帮助MySQL高效获取数据的数据结构(有序)。在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据, 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。 Q3:索引的优缺点有哪些? 答:①优势:提高数据检索的效率,降低数据库的IO成本。通过索引列对数据进行排序,降低数据排序的成本,降低CPU的消耗。②劣势:实际上索引也是一张表,该表中保存了主键与索引字段,并指向实体类的记录,所以索引列也是要占用空间的。 虽然索引大大提高了查询效率,同时却也降低更新表的速度,如对表进行INSERT、UPDATE

MySQL索引查询原理

烂漫一生 提交于 2020-03-28 00:02:14
什么是索引? “索引”是为了能够更快地查询数据。比如一本书的目录,就是这本书的内容的索引,读者可以通过在目录中快速查找自己想要的内容,然后根据页码去找到具体的章节。 数据库也是一样,如果查询语句使用到了索引,会先去索引里面查询,取得数据所在行的物理地址,进而访问数据。 索引的优缺点 优势:以快速检索,减少I/O次数,加快检索速度;根据索引分组和排序,可以加快分组和排序; 劣势:索引本身也是表,因此会占用存储空间。索引的维护和创建需要时间成本,这个成本随着数据量增大而增大;构建索引会降低数据表的修改操作(删除,添加,修改)的效率,因为在修改数据表的同时还需要修改索引表。 索引的分类 在MySQL中,常见的索引类型有:主键索引、唯一索引、普通索引、全文索引、组合索引。创建语法分别为: 其中,组合索引又称为多列索引,上述代码中最后一个例子就是建立了3列的索引。MySQL在根据索引查询时,会遵循“最左匹配”原则,即先根据col1的条件查,再根据col2的条件查,然后再根据col3的条件去查。 如果跳过了一个列直接查后面的列,比如下面的语句,就不能使用上面创建的索引了: 这里有一个小技巧,如果你前面的列是一个简单的枚举类型,比如性别等,可以用在where语句中加 col1 in(MALE, FEMALE) 来“跳过” col1 列,并使用上述索引。 对于某列如果是字符串且比较长(比如UUID

mysql 隐藏坑

故事扮演 提交于 2020-03-27 17:38:38
3 月,跳不动了?>>> MySQL类型转换引发索引失效(隐式类型转换) 最近在网上看到一篇 MySQL字段类型转换引发的索引失效 ,加上常用编程语言是 PHP ,需要具体测试一下发生的原因。 准备 CREATE TABLE `brand` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `order` smallint(6) unsigned NOT NULL DEFAULT '0', `pettype` char(3) CHARACTER NOT NULL DEFAULT '0' COMMENT '品牌类型,1=》狗狗,2=》猫咪', PRIMARY KEY (`id`), KEY `order_idx` (`order`) USING BTREE, KEY `pettype_idx` (`pettype`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8 测试 使用 order 与 pettype 两个字段来做测试 order 字段的使用 int 查询 explain SELECT `order` FROM brand where `order` = 1111; id select_type table partitions type possible_keys key key

【MYSQL】MYSQL的索引类型以及优缺点

寵の児 提交于 2020-03-25 07:57:51
3 月,跳不动了?>>> B-Tree索引 一般没有特殊说明都是默认B-Tree索引,他使用B-Tree数据结构存储数据 B-Tree索引可以加快访问数据的速度,因为存储引擎不再需要进行全表扫描来获取需要的数据,而是从索引的根节点进行搜索 可以使用B-Tree索引的查询类型 全值匹配 匹配最左前缀 匹配列前缀 匹配范围值 精确匹配某一列并范围匹配另外一列 只访问索引的查询 限制 如果不是按照索引的最左列开始查找,则无法使用索引 不能跳过索引中的列。也就是如果有多个列作为索引,只查询一个列,是不会用到这个索引的。 如果查询中有某个列的范围查询,则其右边所有列都无法使用索引优化查找。 这些限制都是跟B-Tree索引结构的顺序性决定的,也就意味着, 不同查询条件需要不同顺序的B-Tree索引 。 哈希索引 哈希索引基于哈希表实现,只有精确匹配索引所有列的查询才有效。 在mysql中,只有Memory引擎显式支持哈希索引,也是Memory引擎的默认索引类型。 限制 不能使用索引中的值来避免读取行 哈希索引数据并不是按照索引值顺序存储的,所以无法用于排序 哈希索引和B-Tree索引一样,也不能支持部分索引列匹配查找 只支持等值比较,不支持范围查询 哈希值一样引起冲突的话,索引代价会很高 空间数据索引(R-Tree) MyISAM表支持空间索引,可以存储地理数据。 必须使用GIS相关函数维护

数据库分库分表

生来就可爱ヽ(ⅴ<●) 提交于 2020-03-12 15:25:28
分库分表---理论 当一张表的数据达到几千万时,查询一次所花的时间会变长。业界公认MySQL单表容量在 1千万 以下是最佳状态,因为这时它的BTREE索引树高在3~5之间。 数据切分可以分为: 垂直切分 和 水平切分 。 一、垂直切分 垂直切分又可以分为: 垂直分库 和 垂直分表 。 1、垂直分库 概念 就是根据业务耦合性,将关联度低的不同表存储在不同的数据库。做法与大系统拆分为多个小系统类似,按业务分类进行独立划分。与"微服务治理"的做法相似, 每个微服务使用单独的一个数据库。 如图: 说明 一开始我们是单体服务,所以只有一个数据库,所有的表都在这个库里。 后来因为业务需求,单体服务变成微服务治理。所以将之前的一个商品库,拆分成多个数据库。每个微服务对于一个数据库。 2、垂直分表 概念 把一个表的多个字段分别拆成多个表,一般按字段的冷热拆分,热字段一个表,冷字段一个表。从而提升了数据库性能。 如图: 说明 一开始商品表中包含商品的所有字段,但是我们发现: 1.商品详情和商品属性字段较长 。 2.商品列表的时候我们是不需要显示商品详情和商品属性信息,只有在点进商品商品的时候才会展示商品详情信息 。 所以可以考虑把商品详情和商品属性单独切分一张表,提高查询效率。 3、垂直切分优缺点 优点 - 解决业务系统层面的耦合,业务清晰 - 与微服务的治理类似,也能对不同业务的数据进行分级管理

Mybatis之多表关系

戏子无情 提交于 2020-03-11 17:41:30
mybatis中多表关联,主要修改mapper.xml文件和eitity实体。 mapper.xml文件中通过resultmap配置返回映射,eitity实体中通过对象引用定义关系。 spring-mybatis.xml文件与pom.xml文件与 spring-mybatis 中相同,选择其中第一种整合方式。 1、数据库执行脚本 SET NAMES utf8mb4; SET FOREIGN_KEY_CHECKS = 0; -- ---------------------------- -- Table structure for item -- ---------------------------- DROP TABLE IF EXISTS `item`; CREATE TABLE `item` ( `itemid` int(11) NOT NULL AUTO_INCREMENT, `itemname` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, PRIMARY KEY (`itemid`) USING BTREE ) ENGINE = InnoDB AUTO_INCREMENT = 4 CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW

Insert into select语句引发的生产事故

落爺英雄遲暮 提交于 2020-03-10 12:02:22
前言   Insert into select请慎用。这天xxx接到一个需求,需要将表A的数据迁移到表B中去做一个备份。本想通过程序先查询查出来然后批量插入。但xxx觉得这样有点慢,需要耗费大量的网络I/O,决定采取别的方法进行实现。通过在Baidu的海洋里遨游,他发现了可以使用 insert into select 实现,这样就可以避免使用网络I/O,直接使用SQL依靠数据库I/O完成,这样简直不要太棒了。然后他就被开除了。 事故发生的经过。   由于数据数据库中 order_today 数据量过大,当时好像有700W了并且每天在以30W的速度增加。所以上司命令xxx将 order_today 内的部分数据迁移到 order_record 中,并将 order_today 中的数据删除。这样来降低 order_today 表中的数据量。   由于考虑到会占用数据库I/O,为了不影响业务,计划是9:00以后开始迁移,但是xxx在8:00的时候,尝试迁移了少部分数据(1000条),觉得没啥问题,就开始考虑大批量迁移。 在迁移的过程中,应急群是先反应有小部分用户出现支付失败,随后反应大批用户出现支付失败的情况,以及初始化订单失败的情况,同时腾讯也开始报警。 然后xxx就慌了,立即停止了迁移。   本以为停止迁移就就可以恢复了,但是并没有。后面发生的你们可以脑补一下。 事故还原  

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

蹲街弑〆低调 提交于 2020-03-09 10:02:00
索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是 顺序查找 (linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如 二分查找 (binary search)、 二叉树查找 (binary tree search)等。如果稍微分析一下会发现,每种查找算法都只能应用于特定的数据结构之上,例如二分查找要求被检索数据有序,而二叉树查找只能应用于 二叉查找树 上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是索引。 看一个例子: 图1 图1展示了一种可能的索引方式。左边是数据表,一共有两列七条记录,最左边的是数据记录的物理地址(注意逻辑上相邻的记录在磁盘上也并不是一定物理相邻的)。为了加快Col2的查找,可以维护一个右边所示的二叉查找树

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

半腔热情 提交于 2020-03-09 10:01:11
摘要 本文以MySQL数据库为研究对象,讨论与数据库索引相关的一些话题。特别需要说明的是,MySQL支持诸多存储引擎,而各种存储引擎对索引的支持也各不相同,因此MySQL数据库支持多种索引类型,如BTree索引,哈希索引,全文索引等等。为了避免混乱,本文将只关注于BTree索引,因为这是平常使用MySQL时主要打交道的索引,至于哈希索引和全文索引本文暂不讨论。 文章主要内容分为三个部分。 第一部分主要从数据结构及算法理论层面讨论MySQL数据库索引的数理基础。 第二部分结合MySQL数据库中MyISAM和InnoDB数据存储引擎中索引的架构实现讨论聚集索引、非聚集索引及覆盖索引等话题。 第三部分根据上面的理论基础,讨论MySQL中高性能使用索引的策略。 数据结构及算法基础 索引的本质 MySQL官方对索引的定义为:索引(Index)是帮助MySQL高效获取数据的数据结构。提取句子主干,就可以得到索引的本质:索引是数据结构。 我们知道,数据库查询是数据库的最主要功能之一。我们都希望查询数据的速度能尽可能的快,因此数据库系统的设计者会从查询算法的角度进行优化。最基本的查询算法当然是 顺序查找 (linear search),这种复杂度为O(n)的算法在数据量很大时显然是糟糕的,好在计算机科学的发展提供了很多更优秀的查找算法,例如 二分查找 (binary search)、 二叉树查找