mysql没索引怎么加锁 mysql有索引但是未命中( 六 )


(1)在不通过索引条件查询时,InnoDB会锁定表中的所有记录 。
(2)Mysql的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然是访问不同行的记录 , 但是如果使用相同的索引键,是会出现冲突的 。
(3)当表有多个索引的时候,不同的事务可以使用不同的索引锁定不同的行,但都是通过行锁来对数据加锁 。
优点:
1、支持事务处理、ACID事务特性;
2、实现了SQL标准的四种隔离级别( 原子性( Atomicity )、一致性( Consistency )、隔离性(Isolation )和持续性(Durability ));
3、支持行级锁和外键约束;
4、可以利用事务日志进行数据恢复 。
5、锁级别为行锁,行锁优点是适用于高并发的频繁表修改,高并发是性能优于 MyISAM 。缺点是系统消耗较大 。
6、索引不仅缓存自身,也缓存数据 , 相比 MyISAM 需要更大的内存 。
缺点:
因为它没有保存表的行数,当使用COUNT统计时会扫描全表 。
使用场景:
(1)可靠性要求比较高,或者要求事务;(2)表更新和查询都相当的频繁,并且表锁定的机会比较大的情况 。
2、 MyISAM存储引擎
MySQL= 5.5 MySQL默认的存储引擎 。ISAM:Indexed Sequential Access Method(索引顺序存取方法)的缩写 , 是一种文件系统 。擅长与处理,高速读与写 。
功能:
(1)支持数据压缩存储,但压缩后的表变成了只读表,不可写;如果需要更新数据 , 则需要先解压后更新 。
(2)支持表级锁定 , 不支持高并发;
(3)支持并发插入 。写操作中的插入操作 , 不会阻塞读操作(其他操作);
优点:
1.高性能读?。?
2.因为它保存了表的行数 , 当使用COUNT统计时不会扫描全表;
缺点:
1、锁级别为表锁,表锁优点是开销小 , 加锁快;缺点是锁粒度大 , 发生锁冲动概率较高,容纳并发能力低,这个引擎适合查询为主的业务 。
2、此引擎不支持事务 , 也不支持外键 。
3、INSERT和UPDATE操作需要锁定整个表;
使用场景:
(1)做很多count 的计算;(2)插入不频繁 , 查询非常频繁;(3)没有事务 。
InnoDB和MyISAM一些细节上的差别:
1、InnoDB不支持FULLTEXT类型的索引,MySQL5.6之后已经支持(实验性) 。
2、InnoDB中不保存表的 具体行数,也就是说,执行select count() from table时,InnoDB要扫描一遍整个表来计算有多少行,但是MyISAM只要简单的读出保存好的行数即可 。注意的是,当count()语句包含 where条件时,两种表的操作是一样的 。
3、对于AUTO_INCREMENT类型的字段,InnoDB中必须包含只有该字段的索引 , 但是在MyISAM表中 , 可以和其他字段一起建立联合索引 。
4、DELETE FROM table时,InnoDB不会重新建立表,而是一行一行的删除 。
5、LOAD TABLE FROM MASTER操作对InnoDB是不起作用的,解决方法是首先把InnoDB表改成MyISAM表,导入数据后再改成InnoDB表,但是对于使用的额外的InnoDB特性(例如外键)的表不适用 。
6、另外,InnoDB表的行锁也不是绝对的,如果在执行一个SQL语句时MySQL不能确定要扫描的范围,InnoDB表同样会锁全表 。
1.索引概述
利用关键字 , 就是记录的部分数据(某个字段,某些字段 , 某个字段的一部分),建立与记录位置的对应关系,就是索引 。索引的关键字一定是排序的 。索引本质上是表字段的有序子集 , 它是提高查询速度最有效的方法 。一个没有建立任何索引的表,就相当于一本没有目录的书,在每次查询时就会进行全表扫描,这样会导致查询效率极低、速度也极慢 。如果建立索引,那么就好比一本添加的目录,通过目录的指引,迅速翻阅到指定的章节,提升的查询性能,节约了查询资源 。

推荐阅读