B+Tree

mysql的索引

假装没事ソ 提交于 2020-05-04 15:46:37
什么是索引 帮助Mysql高效获取数据的数据结构 索引就是数据结构 类似新华字典的索引目录,可以通过索引目录快速查到你想要的字 排好序的快速查找数据 为什么要建立索引 提高查询效率 没有排序之前一个一个往后找 通过索引进行排序之后,可以直接定义到想要的位置 排好序的快速查找数据结构-->就是索引 优势 索引类似大学图书馆建立的书目索引,提高数据检索的效率,降低数据库的IO成本 通过索引对数据项进行排序,降低数据排序成本,降低了CPU的消耗 劣势 一般来说, 索引本身也很大, 索引往往以文件的形式存储到磁盘上 索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录.所以索3引也是要占磁盘空间的 虽然索引提高了查询速度,但是会降低更新表的速度. 因为更新表时, MYSQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段, 会调整因为更新所带来的键值变化后索引的信息 索引分类 单值索引 一个索引只包含间个列,一个表可以有多个单值索引 一般来说, 一个表建立索引不要超过5个 唯一索引 索引列的值必须唯一,但允许有空值 复合索引 一个索引包含多个列 全文索引 MySQL全文检索是利用查询关键字和查询列内容之间的相关度进行检索, 可以利用全文索引来提高匹配的速度。 索引为什么能快速查找数据 二叉查找树 B-Tree B+Tree 基本语法 创建索引 create

【MySQL】MySQL的执行计划及索引优化

≡放荡痞女 提交于 2020-05-03 23:52:58
我们知道一般图书馆都会建书目索引,可以提高数据检索的效率,降低数据库的IO成本。MySQL在300万条记录左右性能开始逐渐下降,虽然官方文档说500~800w记录,所以大数据量建立索引是非常有必要的。MySQL提供了Explain,用于显示SQL执行的详细信息,可以进行索引的优化。 一、导致SQL执行慢的原因: 1.硬件问题。如网络速度慢,内存不足,I/O吞吐量小,磁盘空间满了等。 2.没有索引或者索引失效。(一般在互联网公司,DBA会在半夜把表锁了,重新建立一遍索引,因为当你删除某个数据的时候,索引的树结构就不完整了。所以互联网公司的数据做的是假删除.一是为了做数据分析,二是为了不破坏索引 ) 3.数据过多(分库分表) 4.服务器调优及各个参数设置(调整my.cnf) 二、分析原因时,一定要找切入点: 1.先观察,开启慢查询日志,设置相应的阈值(比如超过3秒就是慢SQL),在生产环境跑上个一天过后,看看哪些SQL比较慢。 2.Explain和慢SQL分析。比如SQL语句写的烂,索引没有或失效,关联查询太多(有时候是设计缺陷或者不得以的需求)等等。 3.Show Profile是比Explain更近一步的执行细节,可以查询到执行每一个SQL都干了什么事,这些事分别花了多少秒。 4.找DBA或者运维对MySQL进行服务器的参数调优。 三、什么是索引? MySQL官方对索引的定义为

mysql中innodb和myisam对比及索引原理区别(转)

浪子不回头ぞ 提交于 2020-05-01 22:00:12
InnoDB和MyISAM是很多人在使用MySQL时最常用的两个表类型,这两个表类型各有优劣,5.7之后就不一样了 1、事务和外键 InnoDB具有事务,支持4个事务隔离级别,回滚,崩溃修复能力和多版本并发的事务安全,包括ACID。如果应用中需要执行大量的INSERT或UPDATE操作,则应该使用InnoDB,这样可以提高多用户并发操作的性能 MyISAM管理非事务表。它提供高速存储和检索,以及全文搜索能力。如果应用中需要执行大量的SELECT查询,那么MyISAM是更好的选择 2、全文索引 Innodb不支持全文索引,如果一定要用的话,最好使用sphinx等搜索引擎。myisam对中文支持的不是很好 不过新版本的Innodb已经支持了 3、锁 mysql支持三种锁定级别,行级、页级、表级; MyISAM支持表级锁定,提供与 Oracle 类型一致的不加锁读取(non-locking read in SELECTs) InnoDB支持行级锁,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表,注意间隙锁的影响 例如update table set num=1 where name like “%aaa%” 4、存储 MyISAM在磁盘上存储成三个文件。第一个文件的名字以表的名字开始,扩展名指出文件类型,

MySQL实战45讲学习笔记:第四讲

此生再无相见时 提交于 2020-04-30 02:01:01
一、索引模型 1、索引的作用: 索引的出现其实是为了提高数据查询的效率,就像书的目录一样 提高数据查询效率 2、索引模型的优缺点比较 二、InnoDB索引模型 1、二叉树是搜索效率最高的,但是实际上大多数的数据库存储却并不适用二叉树? 1、其原因是,索引不止在内存中,还要写到磁盘上 2、N叉树由于在读写上的性能优点,以及适配磁盘的访问模式,已经被广泛应用在数据库引擎中了 3、数据库底层存储的核心就是基于这些数据模型的,每碰到一个新数据库,我们需要先关注它的数据模型,这样才能从离乱山给分析出数据库的适应场景 4、不同存储引擎的索引的工作方式并不一样,而即使多个存储引擎支持同一类型的索引,其底层的实现也可能不同 由于InnoDB存储引擎在MySQL数据库中使用最为广泛,所以下面我就以为例,和你分析一下其中的索引模型 2、索引类型 主键索引: 主键索引的叶子节点存的是整行的数据(聚簇索引), 非主键索引: 非主键索引的叶子节点内容是主键的值(二级索引) 3、主键索引和普通索引的区别: 1、主键索引只要搜索ID这个B+Tree即可拿到数据。 如果语句是 select * from T where ID=500,即主键查询方式,则只需要搜索 ID 这棵 B+ 树 2、普通索引先搜索索引拿到主键值,再到主键索引树搜索一次(回表) 如果语句是 select * from T where k=k

Mysql索引认识

与世无争的帅哥 提交于 2020-04-28 13:41:42
                      全网最简单理解的索引    一个面试题引发 user表 name字段 创建基于name唯一索引,那么下面的会走索引吗? select * from user where name like '%abc' 答案是走或者不走,不同时候不同讨论。 如何选择加还是不加索引呢,某列去重数据/count数据=值,这个值越小,越用不到索引, 三星索引基本上也是这些内容, 那么索引是什么? 帮助Mysql提高查询数据效率的,存储在硬盘中的一种数据结构 。 资料经常讲到“参考”书的目录,书有目录,占用几页的空间,通过目录可以快速的找到需要的内容信息, 这就是索引特点: 通过物理空间,换取执行时间 。   数据结构在线测试网站https://www.cs.usfca.edu/~galles/visualization/Algorithms.html 索引可能根据不同的存储引擎有不同的类型,主要Hash B+Tree 知道Hash 需要了解HashMap 什么是HashMap??????     B+Tree 需要了二叉查找和平衡二叉树 B树演化而来。   二分查找集折半查找 二叉查找 如果按顺序找235678,找到8肯定次数就多了。发现如果就是按id自增顺序插入数据,那么可能不是这种图形了。 引出了一种平衡二叉树:满足二叉树定义,左子树小于右子树

细说mysql索引

≡放荡痞女 提交于 2020-04-26 17:01:17
https://www.cnblogs.com/chenshishuo/p/5030029.html 本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname='css',如果要拿这条数据的话需要些的sql是 SELECT * FROM award WHERE nickname = 'css' 一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描10W条数据找这条数据,如果我在nickname上建立索引,那么mysql只需要扫描一行数据及为我们找到这条nickname='css'的数据,是不是感觉性能提升了好多咧.... mysql的索引分为单列索引(主键索引,唯索引,普通索引)和组合索引. 单列索引:一个索引只包含一个列,一个表可以有多个单列索引. 组合索引:一个组合索引包含两个或两个以上的列, 本文使用的案例的表 CREATE TABLE `award` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', `aty_id` varchar(100) NOT NULL DEFAULT '' COMMENT '活动场景id', `nickname` varchar(12) NOT

细说mysql索引

青春壹個敷衍的年華 提交于 2020-04-26 16:02:26
https://www.cnblogs.com/chenshishuo/p/5030029.html 本文从如何建立mysql索引以及介绍mysql的索引类型,再讲mysql索引的利与弊,以及建立索引时需要注意的地方 首先:先假设有一张表,表的数据有10W条数据,其中有一条数据是nickname='css',如果要拿这条数据的话需要些的sql是 SELECT * FROM award WHERE nickname = 'css' 一般情况下,在没有建立索引的时候,mysql需要扫描全表及扫描10W条数据找这条数据,如果我在nickname上建立索引,那么mysql只需要扫描一行数据及为我们找到这条nickname='css'的数据,是不是感觉性能提升了好多咧.... mysql的索引分为单列索引(主键索引,唯索引,普通索引)和组合索引. 单列索引:一个索引只包含一个列,一个表可以有多个单列索引. 组合索引:一个组合索引包含两个或两个以上的列, 本文使用的案例的表 CREATE TABLE `award` ( `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '用户id', `aty_id` varchar(100) NOT NULL DEFAULT '' COMMENT '活动场景id', `nickname` varchar(12) NOT

MySQl的一些基本知识(1)

久未见 提交于 2020-04-25 09:56:04
数据库优化操作: MySQL优化 数据库优化维度有四个: 硬件、系统配置、数据库表结构、SQL及索引 优化成本: 硬件>系统配置>数据库表结构>SQL及索引 优化效果: 硬件<系统配置<数据库表结构<SQL及索引 运行机制原理和底层架构 MySQL的查询优化,大家都了解一些最简单的技巧:不能使用SELECT *、不使用NULL字段、合理创建索引、为字段选择合适的数据类型….. 你是否真的理解这些优化技巧?是否理解其背后的工作原理?在实际场景下性能真有提升吗?我想未必。因而理解这些优化建议背后的原理就尤为重要 1.MySQL逻辑架构 在头脑中构建一幅MySQL各组件之间如何协同工作的架构图,有助于深入理解MySQL服务器 最上层为客户端层,并非MySQL所独有,诸如:连接处理、授权认证、安全等功能均在这一层处理 中间这一层,包括查询解析、分析、优化、缓存、内置函数(比如:时间、数学、加密等函数)。所有的跨存储引擎的功能也在这一层实现:存储过程、触发器、视图等 第三层包括了存储引擎。通常叫做StorEngine Layer ,也就是底层数据存取操作实现部分,由多种存储引擎共同组成。它们负责存储和获取所有存储在MySQL中的数据。就像Linux众多的文件系统 一样。每个存储引擎都有自己的优点和缺陷 2. MySQL逻辑模块组成 从上图看起来 MySQL 架构非常的简单

Mysql优化 B+Tree索引和Hash索引

半城伤御伤魂 提交于 2020-04-24 07:32:55
B+Tree索引   B+Tree和普通的B-Tree不大一样。有个网站可以体验这些数据结构: https://www.cs.usfca.edu/~galles/visualization/Algorithms.html   先看一下B-Tree      设定最大深度为3,插入10个数字,数据结构如上,他与普通的二叉树区别在于每个节点有多个数据,相当于横向扩展,减少深度。   为什么要减少深度:当数据量比较大的时候,mysql无法将索引全部加载到内存中,只能逐一加载磁盘页,每个磁盘页对应树的节点。造成大量磁盘IO操作(最坏情况下为树的高度)。平衡二叉树由于树深度过大而造成磁盘IO读写过于频繁,进而导致效率低下。所以,我们为了减少磁盘IO的次数,就你必须降低树的深度,将“瘦高”的树变得“矮胖”。   B树在这一点上已经比二叉树先进很多了,但对比B+树还是差了点,为了更好说明B+树,需要提到的是在Mysql中,B数的节点中都带有存储数据。   依然到网站中去体验一下B+树:      可以看到两个特点:     1.同样是三层数据,但是这里多了一层数据层,那是因为,B+树只有最后的叶子节点才会带有数据,其他的都是索引。     2.数据间带有一个指针   这些特点有什么用呢?   1.在Mysql的B树索引方式中,每个节点的存储容量是固定的,如果节点中存储了数据,意味着

MySQL 分页查询优化——延迟关联优化

亡梦爱人 提交于 2020-04-22 02:16:52
目录 1. InnoDB 表的索引的几个概念 2. 覆盖索引和回表 3. 分页查询 4. 延迟关联优化 写在前面 下面的介绍均是在选用 MySQL 数据库和 Innodb 引擎的基础开展。我们先来学习索引的几个概念,帮助我们理解延迟关联优化的加快分页查询速度的原因。 一、 Innodb 表的索引的几个概念 InnoDB 表是基于聚簇索引建立的。 索引一般分为主键索引和普通索引(辅助索引),聚簇索引并不是主键索引这样的单独的索引类型,而是一种数据存储方式。通俗的来说,单独的索引是存储了索引信息的 B+Tree ,而聚簇索引是在同一个结构中保存了 B+Tree 和数据行,即通过主键索引 B+Tree 的结构建立数据文件(网上的说法是索引和数据存储在同一个文件中),因此聚簇索引是一种数据存储方式。 如果对于索引的概念不是很熟悉,建议去查阅相关资料学习,索引是一个很庞大的知识结构。 Innodb 表以主键索引建立后缀名为 .MYD 表存储文件,普通索引亦以 B+Tree 实现,并保存在后缀名为 .MYI 的文件中,具体结构图如下所示: 在查询时选用主键索引和普通索引有什么不一样呢? 以下面语句为例: · select * from table where id = 5; ( id 为主键索引) 检索过程如上图绿色箭头所示,直接在主索引树上根据主键检索 · select * from