解析:
索引的数据结构和具体存储引擎的实现有关.
在MySQL中使用较多的索引有 Hash索引,B+树索引等,而我们经常使用的 InnoDB存储引擎的
默认索引实现为 B+树索引.
解析:
Mysql 可使用多个字段同时建立一个索引,叫做联合索引,在联合索引中,如果想要命中索引,
需要按照建立索引时的字段顺序使用,否则无法命中
具体原因:
Mysql使用索引时需要索引有序,假设现在建立了 name,age,school,的联合索引,那么索引
的排序为:
先按照 name 排序,如果 name 相同在按照 age排序,如果 age 相同在按照 school 排序.
当进行查询时,此时索引仅仅按照 name 严格有序,因为必须首先使用 name 字段进行等
值查询,之后对于匹配到的列而言,其按照 age字段严格
有序,此时可以使用 age 字段用作索引查找,一次类推,因此在建立联合索引的时候应该注意
索引列的顺序,一般情况下,将查询需求频繁或者字段
选择性高的列放在前面,此处可以根据特例的查询或者表结构进行单独的调整.
解析:
A=Atomicity
原子性,就是上面说的,要么全部成功,要么全部失败.不可能只执行一部分操作.
C=Consistency
系统(数据库)总是从一个一致性的状态转移到另一个一致性的状态,不会存在中间状态.
I=Isolation
隔离性: 通常来说:一个事务在完全提交之前,对其他事务是不可见的.注意前面的通常来说加
了红色,意味着有例外情况.
D=Durability
持久性,一旦事务提交,那么就永远是这样子了,哪怕系统崩溃也不会影响到这个事务的结果.
解析:
多事务的并发进行一般会造成以下几个问题:
脏读: A 事务读取到了 B 事务未提交的内容,而 B 事务后面进行了回滚.
不可重复读: 当设置 A 事务只能读取 B 事务已经提交的部分,会造成在 A 事务内的两次查询,
结果竟然不一样,因为在此期间 B 事务进行了提交操作.
幻读: A 事务读取了一个范围的内容,而同时 B 事务在此期间插入了一条数据.造成"幻觉".
MySQL 都有哪些锁呢?像上面那样子进行锁定岂不是有点阻碍并发效率了?
解析:
从锁的类别上来讲,有共享锁和排他锁.
共享锁: 又叫做读锁. 当用户要进行数据的读取时,对数据加上共享锁.共享锁可以同时
加上多个.
排他锁: 又叫做写锁. 当用户要进行数据的写入时,对数据加上排他锁.排他锁只可以加
一个,他和其他的排他锁,共享锁都相斥.
用上面的例子来说就是:
用户的行为有两种,一种是来看房,多个用户一起看房是可以接受的. 一种是真正的入住一
晚,在这期间,无论是想入住的还是想看房的都不可以
锁的粒度取决于具体的存储引擎,InnoDB 实现了行级锁,页级锁,表级锁.
它们的加锁开销从大大小,并发能力也是从大到小.