1.SQL语句的执行过程
having/where的区别
- 1.适用性上来说,having更广,当过滤条件中有聚合函数时,则此过滤条件必须声明在having中;(having伴随着group by来用)
- 2.没有聚合函数时候,使用更加高效的where:因为where关键字先筛选后连接,having则是先连接,后筛选。
2.MySQL数据库中索引的工作机制是什么?
- MySQL的索引与数据都是放在磁盘中的,启动MySQL服务之后(进行查询),会把磁盘中的索引数据加载到内存当中;
- 数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B树以及B+树。
追问1:聚簇索引与非聚簇索引
- 聚簇索引:数据跟索引绑定存储在一起的叫作聚簇索引;
- 非聚簇索引:数据跟索引分开存储的叫作非聚簇索引;
追问2:innodb与myisam分别用什么索引?
- innodb、myisam都属于存储引擎:不同数据文件在磁盘的不同组织形式。
- innodb:既有聚簇索引也有非聚簇索引;
- myisam:只有非聚簇索引;
追问3: 一个表只能有一个索引吗?每一个索引是一个B+树,还是所有索引公用一棵B+树?如果有多棵B+树的话,那么数据存储几份?那么其他索引的叶子节点放什么呢?
-
可以按照需求来创建多个索引,但不要太多;
-
一个索引一棵B+树;
-
数据存储1份;
-
主键(不太准确)跟数据绑定存储的索引列的值;
- 在innodb存储引擎中,数据在进行插入的时候需要跟某一个索引列绑定在一起,这个索引列如果有主键,那么使用主键,如果没有主键,那么用唯一键,如果没有唯一键,那么使用6字节的rowid;
3. 为什么MySQL数据库使用B+树而不使用B树?
- 当存储同数量级的数据的时候,B+树的高度比B树的高度小,这样的话进程IO操作的次数就会减少,效果就高。因为B+树的所有非叶子节点只存索引,数据存在叶子节点,一般3层高度的树,即可存放千万级别的数据,而B树不行。
4. Hash索引和B+树索引区别是什么?
- B+树可以进行范围查询,Hash索引不能;
- B+树支持联合索引的最左侧原则,Hash索引不支持;
- B+树支持order by 排序,Hash索引不支持。
- Hash索引在等值查询(增删改查O(1)) 上比B+树效率更高。
- B+树使用LIKE进行模糊查询的时候,like后面(比如%开头)的话可以起到优化的作用,Hash索引根本无法进行模糊索引。
5.简述常见的索引有哪些?
- 主键索引:主键字段,一种特殊的唯一索引,不允许有空值。一般是在建表的时候同时创建主键索引;
- 唯一索引:唯一字段
- 普通索引:非主键非唯一
- 全文索引:全文索引
- 组合索引:表中的多个字段值可以共同构成索引;
6.什么是回表?索引覆盖?最左匹配原则?
- 回表:select * from table where name = 'zhangsan';先根据name到nameB+树找到对应叶子节点的id值,然后再根据id到idB+树读取整行记录,这种查询方式叫做回表,不推荐使用,效率降低。
- 索引覆盖:叶子节点中包含了所有要查询的字段,此时叫作索引覆盖,效率高,推荐使用。
- 最左匹配:最左匹配,是对于组合索引来说的。索引从原来的一元组变成了多元组,如上图三个箭头所指向的情况,均可以使用组合索引(name, id)。箭头1、2是满足左侧name匹配,箭头4是因为name = ? and id = ? 与 id = ? and name = ? ,结果一致。
7. MySQL的事务(ACID)
- 隔离性 :
补充:快照读与当前读
-
MVCC:多版本并发控制,解决数据并发读写问题。 因为锁的效率底,所以采用了 MVCC。
-
能否看到修改的数据,取决于可见性算法,可见性算法比较的时候取决于readview中的结果值;
-
因为在不同的隔离级别的时候,生成readview的时机是不同的
- RC:每次快照读(select)都会产生新的readview;
- RR:只有当前事务第一次进行快照读的时候生成readview,之后的快照读操作会用当前的readview;
幻读:
- 如果当前的所有操作都是当前读,那么是不会产生幻读问题,只有当前读和快照读一起使用的时候才会产生幻读问题。
- 解决:加锁...