|
@@ -311,15 +311,37 @@ mysql> select * from tuser where name like '张%' and age=10 and ismale=1;
|
|
|
|
|
|
**什么情况下才能用索引下推呢?**
|
|
|
|
|
|
+1. ICP 用于访问方法是 range/ref/eq_ref/ref_or_null,且需要访问表的完整行记录。
|
|
|
+2. ICP适用于 InnoDB 和 MyISAM 的表,包括分区的表。
|
|
|
+3. 对于 InnoDB 表,ICP只适用于二级索引。ICP 的目标是减少访问表的完整行的读数量从而减少 I/O 操作。对于 InnoDB 的聚簇索引,完整的记录已经读进 InnoDB 的缓存,使用 ICP 不能减少 I/O 。
|
|
|
+4. ICP 不支持建立在虚拟列上的二级索引(InnoDB 支持在虚拟列上建立二级索引)。
|
|
|
+5. 引用子查询、存储函数的条件没法下推,Triggered conditions 也没法下推。
|
|
|
+
|
|
|
+### 聚簇索引 与 非聚簇索引
|
|
|
+
|
|
|
+**聚簇索引 特征**
|
|
|
+
|
|
|
+1. 索引必须是唯一索引
|
|
|
+2. 叶子节点处存储的是整行数据
|
|
|
+
|
|
|
+**非聚簇索引 特征**
|
|
|
+
|
|
|
+1. 索引值必须为可不唯一?
|
|
|
+2. 叶子节点处储存的索引行跟主键
|
|
|
+
|
|
|
+InnoDB中,聚簇索引不一定是主键,但主键一定是聚簇索引。
|
|
|
+
|
|
|
+聚簇索引不一定是主键的原因是:聚集索引可能是第一个不允许为 null 的唯一索引,如果也没有这样的唯一索引,InnoDB 会选择内置 6 字节长的 ROWID 作为隐含的聚集索引。
|
|
|
+
|
|
|
## 小结
|
|
|
|
|
|
1. 一张表有多个索引
|
|
|
2. 一个索引对应一张B+树
|
|
|
3. 树结点的key值就是某一行的主键,value是该行的其他数据。新建索引就是新增一个B+树,查询不走索引就是遍历主B+树。
|
|
|
|
|
|
+# 全局锁和表锁
|
|
|
|
|
|
-
|
|
|
-
|
|
|
+**根据加锁的范围,MySQL里面的锁大致可以分成全局锁、表锁和行锁三大类**
|
|
|
|
|
|
|
|
|
|