MyISAM

程序员必须了解的知识点—你搞懂mysql索引机制了吗?

≯℡__Kan透↙ 提交于 2020-11-12 10:25:50
一、索引是什么 MySQL官方对索引的定义为:索引(Index)是帮助MySQL 高效 获取数据的数据结构,而MYSQL使用的数据结构是: B+树 在这里推荐大家看一本书, 《深入理解计算机系统的书》 1.1 局部性原理 程序和数据的访问都有聚集成群的倾向,在一个时间段内,仅使用其中一小部分,在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的( 称空间局部性 ),或者最近访问过的程序代码和数据,很快又被访问的可能性很大( 称时间局部性 )。 1.2 磁盘预读 预读的长度一般为页(page)的整数倍 页是存储器的逻辑块,操作系统往往将主存和磁盘存储区分割成连续的大小相等的块,每个存储块称为一页(在许多操作系统中,页大小通常为4K),主存和磁盘以页为单位交换数据 1.3 简介 在使用数据库中,通常数据库查询是数据库的最主要功能之一。但每种查找算法都只能应用于特定的数据结构之上。 例如二分查找要求被检索数据有序 而二叉树查找只能应用于二叉查找树上,但是数据本身的组织结构不可能完全满足各种数据结构(例如,理论上不可能同时将两列都按顺序进行组织),所以,在数据之外,数据库系统还维护着满足特定查找算法的数据结构,这些数据结构以某种方式引用(指向)数据,这样就可以在这些数据结构上实现高级查找算法。这种数据结构,就是 索引 。 索引一般以文件形式存储在磁盘上,索引检索需要磁盘I

想当程序员中间万元户吗?这几个MySQL核心技术点必须要搞懂!

。_饼干妹妹 提交于 2020-11-12 09:29:37
前言 MySQL 是业务后台系统经常用到的结构化数据库。 掌握 MySQL 相关知识是研发人员必备的能力。 与此同时,在面试过程当中,MySQL 的知识点也是经常被当做面试题目,以此来考量候选人的能力。 随着业务量的增加,对于 MySQL 性能优化的要求也越来越高, 而索引方面是性能优化重点考虑的方向,所以深入理解 MySQL 索引对于未来的优化起到很重要的作用。 深入理解MySQL底层实现 MySQL 的初始、组成 MySQL 的常用引擎(InnoDB、Myisam、MariaDB) 数据存储原理 数据结构 MySQL 数据结构 MySQL 的优化 来自一线大厂高频面试题 唯一索引比普通索引快吗, 为什么 MySQL查询缓存有什么弊端, 应该什么情况下使用, 8.0版本对查询缓存有什么变更. MySQL怎么恢复半个月前的数据 做过哪些MySQL索引相关优化 一千万条数据的表, 如何分页查询 订单表数据量越来越大导致查询缓慢, 如何处理 简要说一下数据库范式 MySQL事务的隔离级别, 分别有什么特点 上面的一些大厂高频面试题以及答案已经整理成文档,需要领取的同学可以关注我, 点我 免费领取 哦! 来自一线互联网公司总结的真题面试收录 一张表,里面有 ID 自增主键,当 insert 了 17 条记录之后,删除了第 15,16,17 条记录,再把 Mysql 重启,再 insert

Alibaba架构师深夜传授我MySQL高级调优笔记,要是再学不会,就去卖红薯

白昼怎懂夜的黑 提交于 2020-11-11 12:14:30
MySQL数据库作发布系统的存储,一天五万条以上的增量,预计运维三年,怎么优化? 为什么索引能提高查询速度? MySQL连接池的连接数说爆就爆了? 关心过业务系统里面的sql耗时吗?统计过慢查询吗?对慢查询都怎么优化过? 最近小编在阿里P7大佬手里扒到这份MySQL高级调优笔记,竟然有80K+星,今天就拿出来分享给大家, 本笔记主要讲解了MySQL中的视图/存储过程/触发器/索引等对象的使用、常见的SQL语句优化的技巧 、应用优化、数据库优化、数据库日志等方面的知识,并通过综合案例,对笔记中的知识进行一个整合应用。旨在通过MySQL高级部分内容,可以在满足现有业务需求基础上,对MySQL底层的体系结构, 对底层的优化有一个深入的理解 , 对系统的整体性能进行提升。 有需要这份MySQL高级调优笔记的朋友看文末有免费的获取方式! MySQL高级调优笔记主要内容 由于篇幅原因,这份纯手写笔记已经被整理成了PDF文档,有需要MySQL高级调优笔记完整文档的麻烦一键三连之后看下图种小助理的微信:(vip1024x)添加即可免费获取到哦 第一部分 : MySQL 常用对象 Linux安装MySQL及启动 MySQL对象 - 索引 MySQL对象 - 视图 MySQL对象 - 存储过程 MySQL对象 - 触发器 第二部分 : MySQL体系结构,存储引擎及SQL优化 MySQL 体系结构

【MySQL】mysql中的锁机制

馋奶兔 提交于 2020-11-09 12:50:39
一、分类 MySQL的锁机制不同的存储引擎支持不同的锁机制,分为表级锁、 行级锁、 页面锁。MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking),但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁,但默认情况下是采用行级锁 表级锁: 开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突的概率最高,并发度最低。 行级锁: 开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发度也最高。 页面锁: 开销和加锁时间界于表锁和行锁之间;会出现死锁;锁定粒度界于表锁和行锁之间,并发度一般 二、表级锁 MySQL的表级锁有两种模式: 表共享读锁(Table Read Lock) 和 表独占写锁(Table Write Lock) 。 对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求,但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和写操作。 MyISAM在执行查询语句(SELECT)前,会自动给涉及的所有表加读锁,在执行更新操作 (UPDATE、DELETE、INSERT等)前,会自动给涉及的表加写锁,这个过程并不需要用户干预,因此,用户一般不需要直接用LOCK

大数据量时Mysql的优化

强颜欢笑 提交于 2020-11-09 05:12:46
(转自网络) 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。 虽然关系型数据库在海量数据中逊色于NoSQL数据库,但是如果你操作正确,它的性能还是会满足你的需求的。针对数据的不同操作,其优化方向也是不尽相同。对于数据移植,查询和插入等操作,可以从不同的方向去考虑。而在优化的时候还需要考虑其他相关操作是否会产生影响。就比如你可以通过创建索引提高查询性能,但是这会导致插入数据的时候因为要建立更新索引导致插入性能降低,你是否可以接受这一降低那。所以,对数据库的优化是要考虑多个方向,寻找一个折衷的最佳方案。 一:查询优化 1:创建索引。 最简单也是最常用的优化就是查询。因为对于CRUD操作,read操作是占据了绝大部分的比例,所以read的性能基本上决定了应用的性能。对于查询性能最常用的就是创建索引。经过测试,2000万条记录,每条记录200字节两列varchar类型的

玩转Mysql系列

牧云@^-^@ 提交于 2020-11-09 03:27:35
Mysql系列的目标是: 通过这个系列从入门到全面掌握一个高级开发所需要的全部技能。 欢迎大家加我微信itsoku一起交流java、算法、数据库相关技术。 这是Mysql系列第22篇。 背景 使用mysql最多的就是查询,我们迫切的希望mysql能查询的更快一些,我们经常用到的查询有: 按照id查询唯一一条记录 按照某些个字段查询对应的记录 查找某个范围的所有记录(between and) 对查询出来的结果排序 mysql的索引的目的是使上面的各种查询能够更快。 预备知识 什么是索引? 上一篇中有详细的介绍,可以过去看一下: 什么是索引? 索引的本质: 通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。 磁盘中数据的存取 以机械硬盘来说,先了解几个概念。 扇区 :磁盘存储的最小单位,扇区一般大小为512Byte。 磁盘块 :文件系统与磁盘交互的的最小单位(计算机系统读写磁盘的最小单位),一个磁盘块由连续几个(2^n)扇区组成,块一般大小一般为4KB。 磁盘读取数据 :磁盘读取数据靠的是机械运动,每次读取数据花费的时间可以分为 寻道时间、旋转延迟、传输时间 三个部分,寻道时间指的是磁臂移动到指定磁道所需要的时间,主流磁盘一般在5ms以下;旋转延迟就是我们经常听说的磁盘转速

MySQL数据库的索引、事务与存储引擎详解

风流意气都作罢 提交于 2020-11-05 10:52:42
目录 一、索引 1.1 什么是索引 1.2 索引的作用 1.3 创建索引的原则 1.4 索引的类型和举例 1.5 删除索引 二、事务 2.1 什么是事务 2.2 事务的ACID特点 2.3 事务控制语句 2.4 事务的控制方法 2.5 事务的操作举例 三、存储引擎 3.1 什么是存储引擎 3.2 存储引擎的作用和工作原理 3.3 myisam引擎的特点和适用场景 3.4 innodb引擎的特点和适用场景 3.5 企业选择存储引擎依据 3.6 如何修改存储引擎 一、索引 1.1 什么是索引 是一个排序的列表,存储着索引值和这个值所对应的物理地址 无需对整个表进行扫描,通过物理地址就可以找到所需数据 是表中一列或者若干列值排序的方法 需要额外的磁盘空间,伴随着表直接存在 1.2 索引的作用 数据库利用各种快速定位技术,能够大大加快查询速率 当表很大或查询涉及到多个表时,可以成千上万倍地提高查询速度 可以降低数据库的IO成本,并且还可以降低数据库的排序成本, IO:输入(写入、更改数据),输出(读取数据) 通过创建唯一性索引保证数据表数据的唯一性 可以加快表与表之间的连接 在使用分组和排序时,可大大减少分组和排序时间 1.3 创建索引的原则 1、表的主键、外键必须有索引 2、数据量超过300行的表应该有索引 3、经常与其他表进行连接的表,在连接字段上应该建立索引 4

浅谈Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景

余生长醉 提交于 2020-10-30 04:22:03
Mysql共享锁、排他锁、悲观锁、乐观锁及其使用场景 一、相关名词 |--表级锁(锁定整个表) |--页级锁(锁定一页) |--行级锁(锁定一行) |--共享锁(S锁,MyISAM 叫做读锁) |--排他锁(X锁,MyISAM 叫做写锁) |--悲观锁(抽象性,不真实存在这个锁) |--乐观锁(抽象性,不真实存在这个锁) 二、InnoDB与MyISAM Mysql 在5.5之前默认使用 MyISAM 存储引擎,之后使用 InnoDB 。查看当前存储引擎: show variables like '%storage_engine%'; MyISAM 操作数据都是使用的表锁,你更新一条记录就要锁整个表,导致性能较低,并发不高。当然同时它也不会存在死锁问题。 而 InnoDB 与 MyISAM 的最大不同有两点:一是 InnoDB 支持事务;二是 InnoDB 采用了行级锁。也就是你需要修改哪行,就可以只锁定哪行。 在 Mysql 中,行级锁并不是直接锁记录,而是锁索引。索引分为主键索引和非主键索引两种,如果一条sql 语句操作了主键索引,Mysql 就会锁定这条主键索引;如果一条语句操作了非主键索引,MySQL会先锁定该非主键索引,再锁定相关的主键索引。 InnoDB 行锁是通过给索引项加锁实现的,如果没有索引,InnoDB 会通过隐藏的聚簇索引来对记录加锁。也就是说

索引的类型及分类

百般思念 提交于 2020-10-30 03:09:21
一、索引方法 Mysql目前主要有以下几种索引类型:FULLTEXT,HASH,BTREE,RTREE。 1. FULLTEXT 即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR、VARCHAR ,TEXT 列上可以创建全文索引。 全文索引并不是和MyISAM一起诞生的,它的出现是为了解决WHERE name LIKE “%word%"这类针对文本的模糊查询效率较低的问题。 2. HASH 由于HASH的唯一(几乎100%的唯一)及类似键值对的形式,很适合作为索引。 HASH索引可以一次定位,不需要像树形索引那样逐层查找,因此具有极高的效率。但是,这种高效是有条件的,即只在“=”和“in”条件下高效,对于范围查询、排序及组合索引仍然效率不高。 3. BTREE BTREE索引就是一种将索引值按一定的算法,存入一个树形的数据结构中(二叉树),每次查询都是从树的入口root开始,依次遍历node,获取leaf。这是 MySQL里默认和最常用的索引类型。 4. RTREE RTREE在MySQL很少使用,仅支持geometry数据类型,支持该类型的存储引擎只有MyISAM、BDb、InnoDb、NDb、Archive几种。 相对于BTREE,RTREE的优势在于范围查找。 ps

企业面试题|最常问的MySQL面试题集合(三)

会有一股神秘感。 提交于 2020-10-29 14:25:48
点击上方“ 民工哥技术之路 ”,选择“置顶公众号” 有趣有内涵的文章第一时间送达! 接上二篇: 企业面试题|最常问的MySQL面试题集合(一) 企业面试题|最常问的MySQL面试题集合(二) 问题27:简述MySQL分表操作和分区操作的工作原理,分别说说分区和分表的使用场景和各自优缺点。 考点分析 分区表的原理 分库分表的原理 延伸: MySQL的复制原理及负载均衡 分区表的工作原理 对用户而言,分区表是一个独立的逻辑表,但是底层MySQL将其分成了多个物理子表,这对用户来说是透明的,每一个分区表都会使用一个独立的表文件。 如图所示:MySQL将表分成多个物理字表,但PHP客户端并无感知,仍然认为操作的是一个表。 创建表时使用partition by子句定义每个分区存放的数据,执行查询时,优化器会根据分区定义过滤那些没有需要的数据的分区,这样只需要查询数据所在分区即可。 这样子表相对于未分区的表来说占用空间小,数据量更小,因此操作速度更快。 分区的主要目的是将数据按照一个较粗的粒度分在不同的表中,这样可以将相关的数据存放在一起,而且如果想一次性的删除整个分区的数据也和方便。 适用场景 1、表非常大,无法全部存在内存,或者只在表的最后有热点数据,其他都是历史数据。 2、分区表的数据更易维护,可以对独立的分区进行独立的操作。 3、分区表的数据可以分布在不同的机器上,从而高效适用资源。