原子性:指事务包含的所有操作要么全部成功,要么全部失败回滚。
一致性:一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态。
隔离性:当多个用户并发访问数据库时,比如同时操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性:持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的。
脏读:读到了别的事务回滚前的脏数据。
幻读:当前事务第一次读取到的数据比后来读取到的数据条目少(针对insert)。
不可重复读:当前事务先进行了一次数据读取,然后再次读取到的数据是别的事务修改成功的数据,导致两次读取到的数据不匹配。
读未提交:即能够读取到没有被提交的数据,所以很明显这个级别的隔离机制无法解决脏读、不可重复读、幻读中的任何一种,因此很少使用。
读已提交:即能够读到那些已经提交的数据,自然能够防止脏读,但是无法限制不可重复读和幻读。这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。
可重复读:它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。(Mysql默认的事务隔离级别)
可串行化:这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。
假设一个组合索引idx_id_name_age,只要查询条件中带有最左边的列id,那么查询就会使用到索引。
一、适合加索引的列
1、对于经常查询的字段,一定是为搜索条件的字段创建索引。
2、某字段本身具有唯一性特征时,指定唯一索引能提高查询速度。比如身份证号字段,每个用户的身份证号是唯一的。
3、在频繁进行跑排列分组(即进行 group by 或 order by操作)的列上建立索引,如果待排序有多个,可以在这些列上建立组合索引。
二、不适合加索引的列
1、索引不是越多越好,一个表如果有大量索引,不仅占用磁盘空间,而且会影响INSERT,DELETE,UPDATE等语句的性能。
2、避免对经常更新的表进行过多的索引,因为当表中数据更改的同时,索引也会进行调整和更新,十分消耗系统资源。
3、数据量小的表建议不要创建索引,数据量小时索引不仅起不到明显的优化效果,对于索引结构的维护反而消耗系统资源。
4、不要在区分度低的字段建立索引。比如性别字段,只有 “男” 和 “女” ,建索引完全起不到优化效果。
1、哈希索引适合等值查询,但是无法进行范围查询。
2、哈希索引也没办法利用索引完成排序,以及like ‘xxx%’ 这样的部分模糊查询。
3、哈希索引不支持多列联合索引的最左匹配规则。
4、B+树索引的关键字检索效率比较平均,不像B树那样波动幅度大,如果有大量重复键值的情况下,哈希索引的效率会很低,因为存在哈希碰撞问题。
1、聚簇索引的叶节点就是数据节点,而非聚簇索引的叶节点仍然是索引节点,并保留一个链接指向对应数据块。
2、聚簇索引主键的插入速度要比非聚簇索引主键的插入速度慢很多。
3、当查询、排序的时候聚簇索引则比较快。
4、非聚簇索引会有回表现象(根据主键再去聚集索引中进行查找,这个再根据聚集索引查找数据的过程,我们称为回表),但可以用覆盖索引解决(所有查询字段都在索引中覆盖到)。
1、InnoDB 支持事务,MyISAM 不支持事务。这是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一。
2、InnoDB 支持外键,而 MyISAM 不支持。对一个包含外键的 InnoDB 表转为 MYISAM 会失败。
3、InnoDB 是聚集索引,MyISAM 是非聚集索引。
4、InnoDB 不保存表的具体行数,执行 select count(*) from table 时需要全表扫描。而MyISAM 用一个变量保存了整个表的行数,执行上述语句时只需要读出该变量即可,速度很快。
5、InnoDB 最小的锁粒度是行锁,MyISAM 最小的锁粒度是表锁。一个更新语句会锁住整张表,导致其他查询和更新都会被阻塞,因此并发访问受限。这也是 MySQL 将默认存储引擎从 MyISAM 变成 InnoDB 的重要原因之一。
作用:
1、做数据的热备,作为后备数据库,主数据库服务器故障后,可切换到从数据库继续工作,避免数据丢失。
2、通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(主增删改,从查)来提升数据库的并发的负载均衡能力。
原理:主从复制的原理其实就是从服务器读取主服务器的binlog,然后根据binlog的记录来更新数据库。
使用explain 命令,其描述 MySQL 如何执行查询操作、执行顺序,使用到的索引,以及 MySQL 成功返回结果集需要执行的行数,用于定位SQL效率低下的原因,从而改进我们的查询。
1、行级锁:行级锁是MySQL中锁定粒度最细的一种锁,表示只针对当前操作的行进行加锁。行级锁能大大减少数据库操作的冲突。其加锁粒度最小,但加锁的开销也最大。(InnoDB采用行级锁和表级锁,默认为行级锁)。
2、表级锁:表级锁是MySQL中锁定粒度最大的一种锁,表示对当前操作的整张表加锁。(MyISAM采用表级锁)。
3、共享锁:又叫读锁,当用户要进行数据的读取时,对数据加上共享锁。共享锁可以同时加上多个。
4、排他锁:又叫做写锁。当用户要进行数据的写入时,对数据加上排他锁。排他锁只有一个,他和其他的排他锁、共享锁都相斥。
5、意向锁:意向锁是一种表锁,分为意向共享锁和意向排他锁两种意向锁。用户无法操作意向锁,意向锁是由InnoDB自己维护的。
6、死锁:死锁是指两个或多个事务在统一资源上相互占用,并请求锁定对方的资源,从而导致恶性循环的现象。
7、乐观锁:认为数据一般情况下不会造成冲突,所以在数据进行提交更新的时候,才会正式对数据的冲突与否进行检测,如果发现冲突了,则让用户返回错误的信息。让用户决定如何去做。
8、悲观锁,就是对数据的冲突采取一种悲观的态度,也就是说假设数据肯定会冲突,所以在数据开始读取的时候就把数据锁定住。