mysql索引

my39_InnoDB锁机制之Gap Lock、Next-Key Lock、Record Lock解析

自古美人都是妖i 提交于 2020-01-26 21:22:16
MySQL InnoDB支持三种行锁定方式: 行锁(Record Lock):锁直接加在索引记录上面,锁住的是key。 间隙锁(Gap Lock): 锁定索引记录间隙,确保索引记录的间隙不变。间隙锁是针对事务隔离级别为可重复读或以上级别而已的。 Next-Key Lock :行锁和间隙锁组合起来就叫Next-Key Lock。 默认情况下,InnoDB工作在可重复读隔离级别下,并且会以Next-Key Lock的方式对数据行进行加锁,这样可以有效防止幻读的发生。 Next-Key Lock是行锁和间隙锁的组合,当InnoDB扫描索引记录的时候,会首先对索引记录加上行锁(Record Lock),再对索引记录两 边的间隙加上间隙锁(Gap Lock)。加上间隙锁之后,其他事务就不能在这个间隙修改或者插入记录。 Gap Lock在InnoDB的唯一作用就是防止其他事务的插入操作,以此防止幻读的发生。 行锁(Record Lock) 行锁锁定的是索引记录,而不是行数据,也就是说锁定的是key。 间隙锁(Gap Lock) 例如: create table test(id int,v1 int,v2 int,primary key(id),key `idx_v1`(`v1`))Engine=InnoDB DEFAULT CHARSET=UTF8; insert into test

MySQL 索引总结

别等时光非礼了梦想. 提交于 2020-01-26 15:56:02
1、索引是做什么的? 想象一下,你面前有本词典,数据就是书的正文内容,你就是那个cpu,而索引,则是书的目录 索引用于快速找出在某个列中有一特定值的行。不使用索引,MySQL必须从第1条记录开始然后读完整个表直到找出相关的行。 表越大,花费的时间越多。如果表中查询的列有一个索引,MySQL能快速到达一个位置去搜寻到数据文件的中间,没有必要看所有数据。 大多数MySQL索引(PRIMARY KEY、UNIQUE、INDEX和FULLTEXT)在B树中存储。只是空间列类型的索引使用R-树,并且MEMORY表还支持hash索引。 2、索引越多越好? 大多数情况下索引能大幅度提高查询效率,但: 数据的变更(增删改)都需要维护索引,因此更多的索引意味着更多的维护成本 更多的索引意味着也需要更多的空间 (一本100页的书,却有50页目录?) 过小的表,建索引可能会更慢 (读个2页的宣传手册,你还先去找目录?) 3、索引的字段类型问题 text类型,也可建索引(需指定长度) myisam存储引擎索引键长度综合不能超过1000字节 用来筛选的值尽量保持和索引列同样的数据类型 尽量减少like,但不是绝对不可用,"xxxx%" 是可以用到索引的, 想象一下,你在看一本成语词典,目录是按成语拼音顺序建立,查询需求是,你想找以 "一"字开头的成语("一%"),和你想找包含一字的成语("%一%")

Mysql 层级、执行顺序、执行计划分析

一笑奈何 提交于 2020-01-26 13:25:04
逻辑分层 下面是MySQL的逻辑分层图: 连接层:连接与线程处理,这一层并不是MySQL独有,一般的基于C/S架构的都有类似组件,比如连接处理、授权认证、安全等。 服务层:包括缓存查询、解析器、优化器,这一部分是MySQL核心功能,包括解析、优化SQL语句,查询缓存目录,内置函数(日期、时间、加密等函数)的实现。 引擎层:负责数据存储,存储引擎的不同,存储方式、数据格式、提取方式等都不相同,这一部分也是很大影响数据存储与提取的性能的;对存储层的抽象。 存储层:存储数据,文件系统。 存储引擎 查看数据库支持的存储引擎:show engines; 如果要想查看数据库默认使用哪个引擎,可以通过使用命令: show variables like '%storage_engine%'; InnoDB,MyISAM的主要区别: InnoDB:在MySQL5.5开始作为默认的存储引擎,支持事务,行级锁,适合高并发场景,XA协议支持分布式事务, 事务优先 。 MyISAM:不支持事务, 性能优先 ,表级锁,不适合高并发场景。 sql执行顺序: https://www.cnblogs.com/annsshadow/p/5037667.html explain-执行计划 explain显示了mysql如何使用索引来处理select语句以及连接表。可以帮助选择更好的索引和写出更优化的查询语句。 使用方法

MySQL5.6之use_index_extensions优化

牧云@^-^@ 提交于 2020-01-26 12:54:55
InnoDB的二级索引(Secondary Index)除了存储索引列key值,还存储着主键值(而不是指向主键的指针)。为什么这样做?因为InnoDB是以聚集索引方式组织数据的存储,即主键值相邻的数据行紧凑的存储在一起(索引组织表)。当数据行移动或者发生页分裂的时候,可以减少大量的二级索引维护工作。InnoDB移动行时,无需更新二级索引。 CREATE TABLE t1 ( i1 INT NOT NULL DEFAULT 0, i2 INT NOT NULL DEFAULT 0, d DATE DEFAULT NULL, PRIMARY KEY (i1, i2), INDEX k_d (d) ) ENGINE = InnoDB; 数据表t1的schema设计如上面所示。二级索引k_d(d)的元组在InnoDB内部实际被扩展成(d,i1,i2),即包含主键值。因此在设计主键的时候,常见的一条设计原则是要求主键字段尽量简单(整型数值,自增),以避免二级索引过大。在MySQL5.6.9之前,优化器在决定是否使用一个索引或者怎样使用一个索引的时候,并不考虑索引中扩展的主键列这一部分。而从MySQL5.6.9开始,优化器开始考虑使用扩展的主键列,这样可以产生更高效的执行计划和更好的性能。 优化器可以把扩展的二级索引用于ref,range,index_merge索引访问、松散索引扫描

【mysql】Innodb三大特性之insert buffer

旧城冷巷雨未停 提交于 2020-01-26 12:33:27
一、什么是insert buffer insert buffer是一种特殊的数据结构(B+ tree) 并不是缓存的一部分,而是物理页 , 当受影响的索引页不在buffer pool时 缓存 secondary index pages的变化, 当buffer page读入buffer pool时 ,进行合并操作,这些操作可以是 INSERT , UPDATE , or DELETE operations (DML) 最开始的时候只能是insert操作,所以叫做insert buffer,现在已经改叫做change buffer了 insert buffer 只适用于 non-unique secondary indexes 也就是说 只能用在非唯一的索引上 ,原因如下 1、primary key 是 按照递增的顺序进行插入的,异常插入聚族索引一般也顺序的,非随机IO 2 写唯一索引要检查记录是不是存在,所以在修改唯一索引之前,必须把修改的记录相关的索引页读出来才知道是不是唯一、这样Insert buffer就没意义了,要读出来(随机IO) 所以只对非唯一索引有效 二、insert buffer的原理 对于为非唯一索引,辅助索引的修改操作并非实时更新索引的叶子页,而是把若干对同一页面的更新缓存起来做,合并为一次性更新操 作, 减少IO,转随机IO为顺序IO

MySQL事务和锁的相关概念

断了今生、忘了曾经 提交于 2020-01-26 11:38:47
大家肯定都打过游戏,对于一个游戏通关来说,通了就是通了,没通就是没通。 那对于事务来讲,一组 SQL 语句全部执行成功才是成功,只要有一个 SQL 语句执行失败,整个就崩掉了。 1)事务的概念 2)事务的特性 3)事务的隔离级别 4)锁 5)一些事务相关的 SQL 语句 6) MySQL 中常使用的引擎 1、什么是事务 事务是有一条或者是多条对数据库操作的SQL组成的一个不可分割的单元, 只有当事务中的所有的操作都正常执行时,整个事务才提交给数据库 1)事务是一组SQL语句的执行,要么全部执行成功,要么全部执行失败, 不能出现部分成功和失败,保证原子操作 2)事务中所有的数据执行成功,才能提交( commit )事务,把结果写入磁盘 3)事务在执行过程中,有的SQL出现了错误,那么事务必须回滚( rollback ) 到最初的状态 当一个事务正确提交后,那个值才会刷新到磁盘上。 2、事务的一些性质 事务的ACID特征: 一个事务必须满足以下4个特征: A(Atomic):原子性 事务是一个不可分割的整体,事务必须具有原子特性,当数据发生变更时,要么全部成功,要么全部失败,不存在部分成功和失败 通关与未通关 C(Consistency):一致性 一个事务的执行前后,数据库中的数据必须保持一致性的特征。 I(Isolation):隔离性 当两个或者多个事务进行并发操作时

深入了解mysql--gap locks,Next-Key Locks

时光毁灭记忆、已成空白 提交于 2020-01-25 22:47:42
Next-Key Locks Next-Key Locks是在存储引擎innodb、事务级别在 可重复读 的情况下使用的数据库锁,官网上有介绍,Next-Key Locks是行锁和gap锁的组合。行锁是什么我们都很清楚,这篇文章主要简单分析一下mysql中的gap锁是什么。innodb默认的锁就是Next-Key locks。 GAP锁 gap锁,又称为间隙锁。存在的主要目的就是为了防止在 可重复读 的事务级别下,出现幻读问题。 在可重复读的事务级别下面,普通的select读的是快照,不存在幻读情况,但是如果加上for update的话,读取是已提交事务数据,gap锁保证for update情况下,不出现幻读。 那么gap锁到底是如何加锁的呢? 假如是for update级别操作,先看看几条总结的何时加锁的规则。 唯一索引 精确等值检索,Next-Key Locks就退化为记录锁,不会加gap锁 范围检索,会锁住where条件中相应的范围,范围中的记录以及间隙,换言之就是加上记录锁和gap 锁(至于区间是多大稍后讨论)。 不走索引检索,全表间隙加gap锁、全表记录加记录锁 非唯一索引 精确等值检索,Next-Key Locks会对间隙加gap锁(至于区间是多大稍后讨论),以及对应检索到的记录加记录锁。 范围检索,会锁住where条件中相应的范围,范围中的记录以及间隙

数据库的事务与锁初理解

孤者浪人 提交于 2020-01-25 21:41:02
前沿: 以下内容大多来自以下三篇文章 Mysql事务与锁详解 MySqL 事务与锁的深入学习笔记 Mysql事务实现原理 (很推荐看下) 对于insert、update、delete,InnoDB会自动给涉及的数据加排他锁(X); 对于一般的select语句,InnoDB不会加任何锁 ,事务可以通过以下语句给显式的加共享锁或排他锁。 -- 共享锁: SELECT * from tb_user LOCK IN SHARE MODE ; -- 排他锁: SELECT * from tb_user FOR UPDATE ; 共享锁(S) 排它锁(X) 若某个事物对某一行加上了排他锁,只能这个事务对其进行读写,在此事务结束之前,其他事务不能对其进行 加任何锁 (如何执行的语句没有锁,那么就不会影响, 比如默认的select语句就是没有任何锁的 ),其他进程可以读取,不能进行写操作,需等待其释放。 排它锁是悲观锁的一种实现 执行存储过程,开启事务,但是不提交,即锁一直在 CREATE DEFINER = ` root ` @`localhost` PROCEDURE ` NewProc ` ( ) BEGIN start transaction ; set session transaction isolation level read committed ; SELECT name

密集索引稀疏索引

烂漫一生 提交于 2020-01-25 19:38:33
密集索引稀疏索引的区别 密集索引文件中的每个搜索码值都对应一个索引值 稀疏索引文件只为索引码的某些值建立索引项 MySQL的InnoDB 若一个主键被定义,该主键则作为密集索引 若没有主键定义,该表的第一个唯一非空索引则作为密集索引 若不满足以上条件,innodb内部会生成一个隐藏主键(密集索引) 非主键索引存储相关键位和其对应的主键值,包含两次查找。 InnoDB索引和数据是存储在一起的(一个文件) 而MyISAM索引和数据存储是分开的(两个文件) 来源: https://www.cnblogs.com/linlf03/p/12233295.html

MYSQL调优实战

╄→гoц情女王★ 提交于 2020-01-25 18:33:41
一:基础数据准备 DROP TABLE IF EXISTS `tbl_user`; CREATE TABLE `tbl_user` ( `id` int ( 11 ) NOT NULL AUTO_INCREMENT, `username` varchar( 255 ) DEFAULT NULL, `email` varchar( 20 ) DEFAULT NULL, `age` tinyint( 4 ) DEFAULT NULL, `type` int ( 11 ) DEFAULT NULL, `create_time` datetime DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE =InnoDB AUTO_INCREMENT= 10 DEFAULT CHARSET= utf8; INSERT INTO `tbl_user` VALUES ( ' 1 ' , ' admin ' , ' admin@126.com ' , ' 18 ' , ' 1 ' , ' 2018-07-09 11:08:57 ' ), ( ' 2 ' , ' mengday ' , ' mengday@163.com ' , ' 31 ' , ' 2 ' , ' 2018-07-09 11:09:00 ' ), ( ' 3 ' , ' mengdee ' , '