一、前言 在MySQL中进行SQL优化的时候,经常会在一些情况下,对MySQL能否利用索引有一些迷惑。例如: MySQL 在遇到范围查询条件的时候就停止匹配了,那么到底是哪些范围条件?...MySQL 在LIKE进行模糊匹配的时候又是如何利用索引的呢? MySQL 到底在怎么样的情况下能够利用索引进行排序?...Index Filter:MySQL用来确定哪些数据是可以用索引去过滤,在启用ICP后,可以用上索引的部分。...四、Between 和Like 的处理 那么如果查询中存在between 和like,MySQL是如何进行处理的呢?...,通过这篇文章,想必大家应该了解到MySQL大部分情况下是如何利用索引的。
大家好,又见面了,我是你们的朋友全栈君。 灵魂3连问: 什么是前缀索引? 前缀索引也叫局部索引,比如给身份证的前 10 位添加索引,类似这种给某列部分信息添加索引的方式叫做前缀索引。...为什么要用前缀索引? 前缀索引能有效减小索引文件的大小,让每个索引页可以保存更多的索引值,从而提高了索引查询的速度。...0.5,那么我们需要继续加大前缀字符的长度,但是这个时候前缀索引的优势已经不明显,就没有创建前缀索引的必要了。...举例说明: 当要索引的列字符很多时 索引则会很大且变慢 ( 可以只索引列开始的部分字符串 节约索引空间 从而提高索引效率 ) 原则: 降低重复的索引值 例如现在有一个地区表 areagdpcode chinaShanghai...貌似查询的时间更长了 因为只第一位字符而言索引值的重读性太大了 200万条数据全以数字开头那么平均20万条的数据都是相同的索引值 重新建立前缀索引 这次以前4位字符来创建 alter table x_test
但是只知道索引能优化显然是不够的,我们更应该知道索引的原理,因为不是加了索引就一定会提升性能。那么接下来就一起探索MYSQL索引的原理吧。...什么是索引 索引其实是一种能高效帮助MYSQL获取数据的数据结构,通常保存在磁盘文件中,好比一本书的目录,能加快数据库的查询速度。除此之外,索引是有序的,所以也能提高数据的排序效率。...通常MYSQL的索引包括聚簇索引,覆盖索引,复合索引,唯一索引,普通索引,通常底层是B+树的数据结构。 总结一下,索引的优势在于: 提高查询效率。 降低数据排序的成本。...索引的数据结构 我们都知道索引的底层数据结构采用的是B+树,但是在讲B+树之前,要先知道B树,因为B+树是在B树上面进行改进优化的。...InnoDB索引 我们常用的MySQL存储引擎一般是InnoDB,所以接下来讲讲几种不同的索引的底层数据结构,以及查找过程。 聚簇索引 前面讲过,每个InnoDB表有且仅有一个聚簇索引。
但你知道 MySQL 是通过什么技术手段来实现的吗? ACID 简介 先来简单回顾一下 ACID 的定义: 原子性:事务作为一个整体被执行,包含在其中的对数据库的操作要么全部被执行,要么都不执行。...因此,持久性的关键就在于如何保证数据可以由内存顺利写入磁盘。...MySQL 给出的方案是 WAL(Write Ahead Log)机制。WAL 翻译过来就是先写日志的意思。这个日志就是 redo log。...写 redo log 和写表的区别就在于随机写和顺序写。MySQL 的表数据是随机存储在磁盘中的,而 redo log 是一块固定大小的连续空间。而磁盘顺序写入要比随机写入快几个数量级。...一致性更侧重是,数据的完整性:主外键约束、唯一索引、列完整等。MySQL 中保证一致性主要靠 CR(Crash Recovery)和 DWB(Doublewrite Buffer)来保证的。
ACID MySQL 作为一个关系型数据库,以最常见的 InnoDB 引擎来说,是如何保证 ACID 的。 (Atomicity)原子性:事务是最小的执行单位,不允许分割。...那么不同的隔离级别,隔离性是如何实现的,为什么不同事物间能够互不干扰?答案是 锁 和 MVCC。 锁 先来说说锁, MySQL 有多少锁。 粒度 从粒度上来说就是表锁、页锁、行锁。...行锁是在引擎层由各个引擎自己实现的。但并不是所有的引擎都支持行锁,比如 MyISAM 引擎就不支持行锁。 行锁的种类 在 InnoDB 事务中,行锁通过给索引上的索引项加锁来实现。...行锁是在需要的时候才加上的,但并不是不需要了就立刻释放,而是要等到事务结束时才释放。这个就是两阶段锁协议。 行锁的实现算法 Record Lock 单个行记录上的锁,总是会去锁住索引记录。...总结 MySQL 都很熟, ACID 也知道是个啥,但 MySQL 的 ACID 怎么实现的?
大家好,又见面了,我是你们的朋友全栈君。...mysql添加索引的方法:可以通过【create table】语句来添加,如【CONSTRAINT PRIMARY KEY | INDEX [] [] 】,表示创建一般索引。...在mysql中可以在创建表(CREATE TABLE)的同时创建索引;也可以在创建表后创建索引,使用CREATE INDEX语句或ALTER TABLE 语句。...而当主键是由多个列组成的多列索引时,则不能使用这种方法,只能用在语句的最后加上一个 PRIMARY KRY(,…) 子句的方式来实现。...具体的做法是在 ALTER TABLE 语句中添加以下语法成分的某一项或几项。
一.介绍 什么是索引?...说起加速查询,就不得不提到索引了。 为什么要有索引呢? 索引在MySQL中也叫做“键”,是存储引擎用于快速找到记录的一种数据结构。...索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要。 索引优化应该是对查询性能优化最有效的手段了。索引能够轻易将查询性能提高好几个数量级。...二.索引的原理 原理 索引的目的在于提高查询效率,与我们查阅图书的目录是一个道理:先定位到类别,比如成功的秘诀,再定位到章节,比如1.成功需要考虑的五件事,再定位到页数,比如120页。...而数据库实现比较复杂,一方面数据是保存在磁盘上的,另外一方面为了提高性能,每次又可以把部分数据读入内存来计算,因为我们知道访问磁盘的成本大概是访问内存的十万倍左右,所以简单的搜索树难以满足复杂的应用场景
(三)聚集索引和非聚集索引 二、MySQL中索引的实现(摘) (一)MyISAM索引实现: (二)InnoDB索引实现: 一、索引的本质 索引是帮助MySQL高效获取数据的排好序的数据结构。...“.MYD”:D是data的意思,这个文件是存储的数据。 “.MYI”:I是Index的意思,这个文件是存储的索引。 可以看到表的结构、数据、索引三种都分开来。这个就是非聚集的。...二、MySQL中索引的实现(摘) 在MySQL中,索引是在存储引擎层实现的,不同存储引擎对索引的实现方式是不同的,下面我们探讨一下MyISAM和InnoDB两个存储引擎的索引实现方式。...(一)MyISAM索引实现: MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址,MyISAM索引的原理图如下。 ?...了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大
大白话意思是索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。 一个索引是存储的表中一个特定列的值数据结构。索引是在表的列上创建。...被作为实现索引的数据结构被创造出来,是因为它能够完美的利用“局部性原理”,其设计逻辑是这样的: - 内存读写快,磁盘读写慢,而且慢很多 - 磁盘预读:磁盘读写并不是按需读取,而是按页预读,一次会读一页的数据...”,这样磁盘预读能充分提高磁盘IO效能 早先的MySQL就是使用的BTREE做为索引的数据结构,随着时间推移,B树发生了较多的变种,其中最常见的就是B+TREE变种,现在MySQL用的就是这种,示意如下...索引基数更加准确一些了。 索引类型 MySQL中有以下索引类型: UNIQUE唯一索引 该索引其含义是被标定义唯一索引的列,不允许出现重复的数据, 但可以有NULL值。...结果是走的主键索引,并没有走idx_cid复合索引,于是结果很清晰了,MySQL中的复合索引有顺序,且很重要,查询条件的顺序不能随意乱写。
大家好,又见面了,我是你们的朋友全栈君。...1.添加PRIMARY KEY(主键索引) mysql>ALTER TABLE `table_name` ADD PRIMARY KEY ( `column` ) 例:alter table yx_marketing_details...add index(id); 2.添加UNIQUE(唯一索引) mysql>ALTER TABLE `table_name` ADD UNIQUE (`column` ) 3.添加INDEX...(普通索引) mysql>ALTER TABLE `table_name` ADD INDEX index_name ( `column` ) 4.添加FULLTEXT(全文索引) mysql...>ALTER TABLE `table_name` ADD FULLTEXT ( `column`) 5.添加多列索引 mysql>ALTER TABLE `table_name` ADD INDEX
我们上一篇讲了MySQL索引背后的数据结构及算法原理,我们知道了为什么使用索引查询数据效率那么高的原理了,我们接着看看MySQL的索引是如何实现的。...MySQL索引实现 在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。...MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址。下图是MyISAM索引的原理图: ?...了解不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大...看这篇文章一定要结合MySQL索引背后的数据结构及算法原理一起看,才能深刻理解。 下一期将具体讨论这些与索引有关的优化策略。
对数据库中数据的改变是持久的,即使数据库发生故障。 接下来就介绍下,MySQL在innoDB引擎下是事务特性的 3隔离性 为什么要先说隔离性呢?...答案是 锁 和 MVCC。 MySQL中的锁从粒度上来说分为表锁、页锁、行锁。 表锁有意向共享锁(IS)、意向排他锁(IX)、自增锁等。...Next-Key Lock临键锁,会锁记录以及记录之间的间隙,就是 record lock 和 gap lock的组合,就是会对索引记录加记录锁 + 索引记录前面间隙上的锁”,就是对要更新的数据的左右两个端点加间隙锁...隔离性的MVCC其实就是依靠它来实现的,原子性也是。实现原子性的关键,是当事务回滚时能够撤销所有已经成功执行的sql语句。...5持久性 持久性依靠的是 redo log。MySQL 里经常说到的 WAL(Write-Ahead Logging) 技术 ,它的关键点就是先写日志,再写磁盘。
对数据库中数据的改变是持久的,即使数据库发生故障。 接下来就介绍下,MySQL在innoDB引擎下是事务特性的 3隔离性 为什么要先说隔离性呢?...答案是 锁 和 MVCC。 MySQL中的锁从粒度上来说分为表锁、页锁、行锁。 表锁有意向共享锁(IS)、意向排他锁(IX)、自增锁等。...Next-Key Lock临键锁,会锁记录以及记录之间的间隙,就是 record lock 和 gap lock的组合,就是会对索引记录加记录锁 + 索引记录前面间隙上的锁”,就是对要更新的数据的左右两个端点加间隙锁...隔离性的MVCC其实就是依靠它来实现的,原子性也是。实现原子性的关键,是当事务回滚时能够撤销所有已经成功执行的sql语句。...总结 MySQL事务应该大家都知道,但是实现原理可能就不是那么清楚,希望本文能对事务的了解有所帮助。 今天多学一点知识,明天就少说一句求人的话
前言 最近在面试,有被问到,MySQL的InnoDB引擎是如何实现事务的,又或者说是如何实现ACID这几个特性的,当时没有答好,所以自己总结出来,记录一下。...MySQL的InnoDB引擎是靠undo log(回滚日志)来实现的,undo log能够保证在事务回滚时,能够撤销所有已经执行成功的SQL。...第二点层次上的区别: redo log是存储引擎InnoDB实现的(MyISAM就没有redo log),而binlog是在MySQL服务器层面存在的任何其他存储引擎也有binlog。...间隙锁:间隙锁是为了防止产生幻读而加的锁,加在不存在的空闲空间,可以是两个索引记录之间,也可能是第一个索引记录之前或最后一个索引之后的空间(但是并不包含当前记录)。...MVCC的主要是靠在每行记录上增加隐藏列和使用undo log来实现的,隐藏列主要包括,改行数据创建的版本号(递增的),删除时间,指向undo log的指针等。 那么MVCC是如何保证读写隔离的呢?
若现在定位到下层的索引页35,此时在索引页35里也有一些索引条目,分别都是下层各索引页(20、28、59)及他们里面最小的主键值,此时在索引页35的索引条目里继续二分查找,容易定位到,应该再到下层的索引页里找...若你的数据页开始进行页分裂,他此时会调整各数据页内部的行数据,保证数据页内的主键值都有序,: 下一个数据页的所有主键值>上一个数据页的所有主键值 页分裂时,也会维护你的上层索引数据结构,在上层索引页里维护你的索引条目...然后若你的数据页越来越多,一个索引页放不下了,就会再拉出新的索引页,同时再搞一个上层的索引页,上层索引页里存放的索引条目就是下层索引页页号和最下主键值。...同理可得,若你的数据量越大,此时可能就多出更多索引页层级,不过一般索引页里可以放很多索引条目,即使你是亿级大表,基本上大表里建的索引的层级也就三四层。...聚簇索引默认按主键组织的,所以你在增删改数据时: 会更新数据页 会给你自动维护B+树结构的聚簇索引,给新增和更新索引页,这个聚簇索引是默认就会给你建立
简单理解一下可重复读 可重复读是指:一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。 我们可以简单理解为:在可重复读隔离级别下,事务在启动的时候就”拍了个快照“。...注意,这个快照是基于整个库的。 这时,你可能就会想,如果一个库有 100G,那么我启动一个事务,MySQL就要拷贝 100G 的数据出来,这个过程得多慢啊。可是,我平时的事务执行起来很快啊。...实际上,我们并不需要拷贝出这 100G 的数据。我们来看下”快照“是怎么实现的。 拍个快照 InnoDB 里面每个事务都有一个唯一的事务 ID,叫作 transaction id。...它在事务开始的时候向 InnoDB 的事务系统申请的,是按申请顺序严格递增的。...InnoDB 就是利用 undo log 和 trx_id 的配合,实现了事务启动瞬间”秒级创建快照“的能力。
在MySQL中,索引属于存储引擎级别的概念,不同存储引擎对索引的实现方式是不同的,本文主要讨论MyISAM和InnoDB两个存储引擎的索引实现方式。...MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构。 MyISAM会按照数据插入的顺序分配行号,从0开始,然后按照数据插入的顺序存储在磁盘上。...MyISAM的索引方式索引和数据存放是分开的,非聚集”的,所以也叫做非聚集索引。 InnoDB索引实现 虽然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同。...好处是InnoDB在移动行时无需更新一级索引中的这个”指针“,因为主键是不会改变的,但是行指针却会改变。...可以通过MyISAM和InnoDB如何存放表的抽象图帮助快速理解。 InnoDB(聚簇)表分布: MyISAM(非聚簇)表分布:
预计阅读时间:15分钟 小强前几篇文章介绍了mysql的索引原理以及sql优化的一些小技巧。mysql底层的算法选择哪种索引,有时候会和我们想象的不一样,大家可以继续往下看。...可以看到通过select出的字段是覆盖索引,MySQL底层使用了索引优化。...对于上面的这两种 name>'a' 和 name>'zzz'的执行结果, mysql最终是否选择走索引或者一张表涉及多个索引, mysql最终如何选择索引,可以通过trace工具来一查究竟,开启trace..., 索引MySQL最终会选择全表扫描。...,所以MySQL最终选择索引扫描。
MySQL 的解决方案是:既写磁盘又写内存。...log 只在使用了 innodb 作为存储引擎的 MySQL 上才有,而 binlog,只要你是 MySQL,就会有。...未完待续 总结一下: redo log: innodb 在实现高性能写数据的同时,利用 redo log,实现了事务 ACID 中的D,持久性 binlog:MySQL 的数据还原、主从复制,都依赖 binlog...来实现 两阶段提交:为了保证 redo log 和 binlog 的一致性 看似一条简单的 update 语句,MySQL 在这背后其实做了很多事情。...MySQL 是一个把单机性能发挥到极致的数据库,这也是为什么出现了那么多分布式数据库,MySQL 依然是很多公司的首选的原因吧。 当然这篇文章也只是个引子,很多细节,还没有展开。
并发场景 最近做了一些分布式事务的项目,对事务的隔离性有了更深的认识,后续写文章聊分布式事务。今天就复盘一下单机事务的隔离性是如何实现的? 「隔离的本质就是控制并发」,如果SQL语句就是串行执行的。...是通过锁和隔离级别对MySQL进行并发控制的」 MySQL中的锁 行级锁 InnoDB存储引擎中有如下两种类型的行级锁 「共享锁」(Shared Lock,简称S锁),在事务需要读取一条记录时,需要先获取改记录的...「这两种隔离级别是通过MVCC(多版本并发控制)来实现的,本质就是MySQL通过undolog存储了多个版本的历史数据,根据规则读取某一历史版本的数据,这样就可以在无锁的情况下实现读写并行,提高数据库性能...」 「那么undolog是如何存储修改前的记录?」...好了,我们知道了版本可见性的获取规则,那么是怎么实现读已提交和可重复读的呢?」
领取专属 10元无门槛券
手把手带您无忧上云