MySQL对某个表的执行查询时的访问方法,其中的type列就表明了这个访问方法是什么。...,s1作为驱动表,s2作为被驱动表,s2的访问方法是eq_ref表明在访问s2表的时候可以通过主键的等值匹配来进行访问 ref : 当通过普通的二级索引列与常量进行等值匹配时来查询某个表,那么对该表的访问方法就可能是...ref fulltext: 全文索引 ref_or_null: 当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_null。...key_len key_len列表示当优化器决定使用某个索引执行查询时,该索引记录的最大长度。...rows 如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的rows列就代表预计需要扫描的行数,如果使用索引来执行查询时,执行计划的rows列就代表预计扫描的索引记录行数。
MySQL对某个表的执行查询时的访问方法,其中的type列就表明了这个访问方法是什么。...eq_ref: 在连接查询时,如果被驱动表是通过主键或者唯一二级索引(unique)等值匹配的方式进行访问的,则对该被驱动表的访问方法就是eq_ref。...如: 从执行计划的结果中可以看出,s1作为驱动表,s2作为被驱动表,s2的访问方法是eq_ref表明在访问s2表的时候可以通过主键的等值匹配来进行访问 ref : 当通过普通的二级索引列与常量进行等值匹配时来查询某个表...,那么对该表的访问方法就可能是ref fulltext: 全文索引 ref_or_null: 当对普通二级索引进行等值匹配查询,该索引列的值也可以是NULL值时,那么对该表的访问方法就可能是ref_or_null...rows 如果查询优化器决定使用全表扫描的方式对某个表执行查询时,执行计划的rows列就代表预计需要扫描的行数,如果使用索引来执行查询时,执行计划的rows列就代表预计扫描的索引记录行数。
当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况。若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数据库的一致性。 锁是用于管理对公共资源的并发控制。...因此,在分析锁冲突时,别忘了检查 SQL 的执行计划(可以通过 explain 检查 SQL 的执行计划),以确认是否真正使用了索引。...,多个事务可以同时的对相同数据执行 lock in share mode。...当一个线程获得对一个表的写锁后, 只有持有锁的线程可以对表进行更新操作。 其他线程的读、 写操作都会等待,直到锁被释放为止。...InnoDB避免死锁: 为了在单个InnoDB表上执行多个并发写入操作时避免死锁,可以在事务开始时通过为预期要修改的每个元祖(行)使用SELECT ...
当一个线程获得对一个表的写锁后, 只有持有锁的线程可以对表进行更新操作。其他线程的读、 写操作都会等待,直到锁被释放为止。...对索引项加锁,锁定符合条件的行。...多个事务同时锁定同一个资源时也可能会产生死锁 锁的行为和顺序和存储引擎相关。以同样的顺序执行语句,有些存储引擎会产生死锁有些不会——死锁有双重原因:真正的数据冲突;存储引擎的实现方式。...InnoDB避免死锁: 为了在单个InnoDB表上执行多个并发写入操作时避免死锁,可以在事务开始时通过为预期要修改的每个元祖(行)使用SELECT ......explain-demo 第一行(执行顺序4):id列为1,表示是union里的第一个select,select_type列的primary表示该查询为外层查询,table列被标记为,表示查询结果来自一个衍生表
MyISAM 只支持表级锁定(table-level locking),当对表执行写操作(INSERT、UPDATE,DELETE)时,会锁定整个表。...MyISAM 只有表级锁定,当进行写操作时,会锁定整张表,这在高并发的环境下会成为性能瓶颈。...复合索引(Composite Index):当一个索引包含多个列时,称为复合索引。复合索引可以基于多个数据列创建,以支持多列的查询条件。...=)时,索引可以被多个列使用,但一旦碰到第一个范围查询,该查询之后的列(即使在复合索引中定义了)将不会被用作索引查询。 示例: 继续考虑上一个复合索引(A,B,C)。...预处理:之后,分析器进行预处理,检查 SQL 语句中的表和列在数据库中是否存在,以及用户是否有权限对其进行操作。 查询优化:分析器会根据不同的策略选择一个最有效的执行计划。
为了提高在给整张表加锁时,判断表中记录是否已经被锁定的效率,数据库引入了意向锁(Intention Lock)。 意向锁包括意向共享锁(IS锁)和意向独占锁(IX锁)。...意向锁仅记录了对表中记录的锁定意图,避免了遍历整个表来查看记录是否上锁的低效操作。 意向锁可以与其他意向锁兼容,这意味着多个事务可以同时在一个表上持有IS锁和IX锁。...可以看到,当表加了S锁(就是IS锁)之后,对记录加X锁或隐式锁都会被阻塞。查询或者加S锁的查询会成功。...当对一个表执行增删改查操作(DML语句)时,会自动加上MDL读锁。 当对一个表执行结构变更操作(DDL语句)时,会自动加上MDL写锁。...当UPDATE语句条件走二级索引时,在锁定读的过程一定回表,临界记录先对二级索引和聚簇索引加锁,不满足条件就释放聚簇索引和二级索引对应记录的锁。
(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,另外,不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁。...因此,在分析锁冲突时,别忘了检查SQL的执行计划,以确认是否真正使用了索引。 MySQL查询执行路径 1. 客户端发送一条查询给服务器; 2....预处理器则根据一些MySQL规则进一步检查解析树是否合法,例如,这里讲检查数据表和数据列是否存在,还会解析名字和别名,看看它们是否有歧义。...优化count()、min()和max() 索引和列是否为空通常可以帮助MySQL优化这类表达式。...覆盖索引扫描 当索引中的列包含所有查询中需要使用的列的时候,MySQL就可以使用索引返回需要的数据,而无需查询对应的数据行。 7.
当一个线程获得对一个表的写锁后, 只有持有锁的线程可以对表进行更新操作。其他线程的读、 写操作都会等待,直到锁被释放为止。...死锁 死锁产生: 死锁是指两个或多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环 当事务试图以不同的顺序锁定资源时,就可能产生死锁。...多个事务同时锁定同一个资源时也可能会产生死锁 锁的行为和顺序和存储引擎相关。以同样的顺序执行语句,有些存储引擎会产生死锁有些不会——死锁有双重原因:真正的数据冲突;存储引擎的实现方式。...InnoDB避免死锁: 为了在单个InnoDB表上执行多个并发写入操作时避免死锁,可以在事务开始时通过为预期要修改的每个元祖(行)使用SELECT ......列被标记为,表示查询结果来自一个衍生表,其中derived3中3代表该查询衍生自第三个select查询,即id为3的select。
select * from t where id = 10 for update; #注意:如果是普通查询则是快照读,不需要加锁,加了for update就不是普通查询 如果,上面语句中id列没有建立索引或者是非唯一索引时...如果,搜索条件里有多个查询条件(即使每个列都有唯一索引),也是会有间隙锁的。 需要注意的是,当id列上没有索引时,SQL会走聚簇索引的全表扫描进行过滤,由于过滤是在MySQL Server层面进行的。...它的作用是防止其他事务在间隙(两个索引键之间的空白区域)中插入新记录。间隙锁通常用于防止幻读(Phantom Read)的问题,即在一个事务中多次执行同一查询时,查询的结果集合发生了变化。...如果要锁的列没有索引,进行全表记录加锁(上面说过没有索引时SQL会走聚簇索引的全表扫描进行过滤) 记录锁也是排它(X)锁,所以会阻塞其他事务对其插入、更新、删除。...当执行插入操作时,总会检查当前插入操作的下一条记录(已存在的主索引节点)上是否存在锁对象,判断是否锁住了 gap,如果锁住了,则判定和插入意向锁冲突,当前插入操作就需要等待,也就是配合上面的间隙锁或者临键锁一起防止了幻读操作
索引的基本原理 索引用来快速地寻找那些具有特定值的记录。如果没有索引,一般来说执行查询时遍历整张表。...事务的原子性确保动作要么全部完成,要么完全不起作用; 一致性: 执行事务前后,数据保持一致,多个事务对同一个数据读取的结果是相同的; 隔离性: 并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的...表级锁: 表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁,它实现简单,资源消耗较少,被大部分MySQL引擎支持。最常使用的MYISAM与INNODB都支持表级锁定。...需要考虑数据冗余、查询和更新的速度、字段的数据类型是否合理等多方面的内容。 将字段很多的表分解成多个表:对于字段较多的表,如果有些字段的使用频率很低,可以将这些字段分离出来形成新表。...因为当一个表的数据量很大时,会由于使用频率低的字段的存在而变慢。 增加中间表:对于需要经常联合查询的表,可以建立中间表以提高查询效率。
还有替换frm的高效方法,首先create table like来建立新表,修改新表结构,对旧表数据执行锁定”FLUSH TABLES WITH READ LOCK;” 执行系统命令,mv new.frm...当表有聚簇索引时,它的数据行实际上存放在索引的叶子页(LEAF PAGE)中,聚簇表示数据行和相邻的键值紧凑地存储在一起。...但是该列能包含多个列,就像电话簿使用姓氏和名字同时进行排序。 17、INNODB支持聚簇索引,其中聚簇索引就是表,必须要像MYISAM那样的行存储。...当语法树被认为合法了,则由优化器将其转化为执行计划,一条语句可能有很多执行方式并返回相同结果,优化器的作用就是找到这其中最好的执行计划。优化器是基于成本来预测。...当在FROM子句中遇到子查询时,先执行子查询并将其结果放到一个临时表中,然后将这个临时表当做一个普通表对待(派生表)。 10、执行计划,MYSQL生成查询的一颗指令数。
查询日志 查询日志记录了所有对MySQL数据库请求的信息,无论这些请求是否得到了正确的执行。默认文件名为:主机名.log。...当慢查询日志比较大时,想得到执行时间最长的10条SQL语句,可以运行如下命令: mysqldumpslow经常使用的参数: -s,是order的顺序 ----- al 平均锁定时间 -----ar 平均返回记录时间...ref : 没有哪个列或者参数和key一起被使用。 Extra : 使用了where查询。 id select 查询的序列号,包含一组可以重复的数字,表示查询中执行sql语句的顺序。...system:表只有一条记录(等于系统表),这是const类型的特列,平时不会出现,了解即可 possible_keys 显示查询语句可能用到的索引(一个或多个或为null),不一定被查询实际使用。...而意向锁的作用就是当一个事务在需要获取资源锁定的时候,如果遇到自己需要的资源已经被排他锁占用的时候,该事务可以需要锁定行的表上面添加一个合适的意向锁。
这个基数只为2,如果用户频繁地根据Sex列的值查询该表,这就是位图索引的基列。当一个表内包含了多个位图索引时,您可以体会到位图索引的真正威力。...SELECT语句不会受到这种锁定问题的影响。 基于规则的优化器不会考虑位图索引。 当执行ALTER TABLE语句并修改包含有位图索引的列时,会使位图索引失效。...在使用分区后的表和索引时,Oracle还支持并行查询和并行DML。这样就可以同时执行多个进程,从而加快处理这条语句。 ---- 创建索引的一些规则 1....至少要包含组合索引的第一列(即如果索引建立在多个列上,只有它的第一个列被where子句引用时,优化器才会使用该索引) 8. 小表不要建立索引 9....对索引列使用OR将造成全表扫描. 注意, 以上规则只针对多个索引列有效. 如果有column没有被索引, 查询效率可能会因为你没有选择OR而降低.
:自适应散列索引是否被当前事务锁定。...当自适应散列索引搜索系统被分区时,单个事务不会锁定整个自适应散列索引。...当自适应散列索引搜索系统被分区(由innodb_adaptive_hash_index_parts设置分区数量)时,该列值始终为0 TRX_IS_READ_ONLY:事务是否是只读事务,1表是只读 TRX_AUTOCOMMIT_NON_LOCKING...当该列值和TRX_IS_READ_ONLY列值都是1时,InnoDB执行事务优化以减少事务相关的开销 | INNODB_LOCK_WAITS 该表提供查询关于每个被阻塞的InnoDB事务的锁等待记录,包括发生锁等带事务所请求的锁和阻止该锁请求被授予的锁...当该列值为零时,该区块将被驱逐 IS_HASHED:在此页上是否构建了hash索引 NEWEST_MODIFICATION:最新发生修改的LSN号 OLDEST_MODIFICATION:最早发生修改的
如果在事务内打开游标,则该事务更新锁将一直保持到事务被提交或回滚;当提取下一行时,将除去游标锁。如果在事务外打开游标,则提取下一行时,锁就被丢弃。...当评估查询消耗的资源超出限制时,服务器自动取消查询,在查询之前就扼杀掉。...只有在必要使用事物时使用它。 32、用OR的字句可以分解成多个查询,并且通过UNION 连接多个查询。...他们的速度只同是否使用索引有关,如果查询需要用到联合索引,用UNION all执行的效率更高.多个OR的字句没有用到索引,改写成UNION的形式再试图与索引匹配。一个关键的问题是否用到索引。...对单个表检索数据时,不要使用指向多个表的视图,直接从表检索或者仅仅包含这个表的视图上读,否则增加了不必要的开销,查询受到干扰.为了加快视图的查询,MsSQL增加了视图索引的功能。
每个索引最大的列数是16 4、最大的键长度是1000字节,这也可以通过编译来改变,对于键长度超过250字节的情况,一个超过1024字节的键将被用上 5、BLOB和TEXT列可以被索引 6、NULL被允许在索引的列中...,这个值占每个键的0~1个字节 7、所有数字键值以高字节优先被存储以允许一个更高的索引压缩 8、每个MyISAM类型的表都有一个AUTO_INCREMENT的内部列,当INSERT和UPDATE操作的时候该列被更新...MEMORY主要特性有: 1、MEMORY表的每个表可以有多达32个索引,每个索引16列,以及500字节的最大键长度 2、MEMORY存储引擎执行HASH和BTREE缩影 3、可以在一个MEMORY表中有非唯一键值...4、MEMORY表使用一个固定的记录长度格式 5、MEMORY不支持BLOB或TEXT列 6、MEMORY支持AUTO_INCREMENT列和对可包含NULL值的列的索引 7、MEMORY表在所由客户端之间共享...(就像其他任何非TEMPORARY表) 8、MEMORY表内存被存储在内存中,内存是MEMORY表和服务器在查询处理时的空闲中,创建的内部表共享 9、当不再需要MEMORY表的内容时,要释放被MEMORY
locks: 当索引含有唯一约束时 锁定一条记录 · 由于事务的隔离性和一致性要求,会对所有扫描到的record加锁。...UPDATE,DELETE在查询时,直接对查询用的Index和主键使用显示锁,其他索引上使用隐式锁。 C....· 多列索引:当多个索引做相交操作时(AND条件),通常意味着需要一个包含所有相关列的多列索引,而不是多个独立的单列索引。...当多个索引做联合操作时(OR条件),需要耗费大量的CPU和内存在算法的缓存、排序和合并操作上,而优化器不会把这些计算到“查询成本”(COST)中, 优化器只关心随机页面读取。...对定点运行脚本的情况,避免在同一时间点运行多个对同一表进行读写的脚本,特别注意加锁且操作数据量比较大的语句。 6.应用程序中增加对死锁的判断,如果事务意外结束,重新运行该事务,减少对功能的影响。
查询条件的列是唯一索引的情况下,临建锁退化为记录锁 间隙锁 Gap Lock,锁定一个范围,但不包含记录本身。...假如一个索引有10、11、13、20这四个值,那么该索引可能被锁定的区间为: ? 若事务T1已经通过临键锁锁定了如下范围: ? 当插入新的记录12时,则锁定的范围变成: ?...若唯一索引由多列组成,而查询仅是查找多个唯一索引中的一个,那么查询其实是range类型查询,而不是point类型查询,故InnoDB存储引擎还是继续使用临键锁。 ? ?...当客户端执行每条SQL(更新语句)时,redo log会被首先写入log buffer;当客户端执行COMMIT命令时,log buffer中的内容会被视情况刷新到磁盘。...即当两个事务互相等待时,当一个等待时间超过设置的阈值时,其中一个事务进行回滚,另外一个等待的事务就能继续执行。
.2 MyISAM特点 不支持行锁(MyISAM只有表锁),读取时对需要读到的所有表加锁,写入时则对表加排他锁; 不支持事务 不支持外键 不支持崩溃后的安全恢复 在表有读取查询的同时,支持往表中插入新纪录...2) 是否支持事务和崩溃后的安全恢复: MyISAM 强调的是性能,每次查询具有原子性,其执行数度比InnoDB类型更快,但是不提供事务支持。...一般来说,如果需要事务支持,并且有较高的并发读取频率(MyISAM的表锁的粒度太大,所以当该表写并发量较高时,要等待的查询就会很多了),InnoDB是不错的选择。...所以在InnoDB上执行count(*)时一般要伴随where,且where中要包含主键以外的索引列。为什么这里特别强调“主键以外”?...(当AUTO_INCREMENT列被定义为多列索引的最后一列,可以出现重使用从序列顶部删除的值的情况)。
在InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的基础。”数据行级锁定“的意思是指在事务操作的执行过程中锁定正在被处理的个别记录,不让其他用户进行访问。...在JOIN操作中(需要从多个数据表提取数据时),MySQL只有在主键和外键的数据类型相同时才能使用索引。...这么做的好处:一是简化了MySQL对这个索引的管理工作,这个索引也因此而变得更有效率;二是MySQL会在有新记录插入数据表时,自动检查新记录的这个字段的值是否已经在某个记录的这个字段里出现过了;如果是,...row数据列是MySQL在执行这个查询时预计会从这个数据表里读出的数据行的个数。row数据列里的所有数字的乘积可以让我们大致了解这个查询需要处理多少组合。...最后,extra数据列提供了与JOIN操作有关的更多信息,比如说,如果MySQL在执行这个查询时必须创建一个临时数据表,就会在extra列看到 using temporary字样。
领取专属 10元无门槛券
手把手带您无忧上云