-- 第一个问题 关于索引,非唯一索引,当有相同值如何排序
非唯一索引,值相同的话,按照行号等其他字段顺序进行排序;反正最终的结果就是有序排列,利用该关键字可以找到匹配的多条记录
EXPLAIN
SELECT ref_id1 FROM table1 WHERE ref_id1=10003;-- 索引覆盖
EXPLAIN
SELECT ref_id1,id FROM table1 WHERE ref_id1=10003;-- 同样索引覆盖,【充分证明二级索引带着主键ID】
EXPLAIN
SELECT * FROM table1 WHERE ref_id1=10003;-- 根据索引返回匹配的行,使用到了索引idx_ref_id1
[这句话,如何运行的吗?
第一步通过索引idx_ref_id1找到主键的值,
第二步通过主键的值再利用主键索引找到叶子节点所有数据]
TYPE:关联类型,或访问类型,即MYSQL决定的如何去查询表中的行的方式
ALL: 全表扫描
INDEX:根据索引的次序进行全表扫描;如果在Extra列出现“USING INDEX”表示了使用覆盖索引,而非全表扫描
RANGE:有范围限制的根据索引实现范围扫描;扫描位置始于索引中的某一点,结束于另一点
ref: 根据索引返回表中匹配某单个值的所有行
eq_ref:仅返回一行,但需要额外与某个参考值做比较
const, system: 直接返回单个行
性能从上到下依次提升
possible_keys:查询可能会用到的索引
KEY: 查询中使用了的索引
key_len: 在索引中使用的字节数
ref: 在利用KEY字段所表示的索引完成查询时所有的列或某常量值
ROWS:Mysql估计为找所有的目标行而需要读取的行数
Extra:额外信息
USING INDEX:MySQL将会使用覆盖索引,以避免访问表
USING WHERE:MySQL服务器将在存储引擎检索后,再进行一次过滤
USING TEMPORARY:MySQL对结果排序时会使用临时表
USING filesort:对结果使用一个外部索引排序
-- 第二个问题 每次理解回表查询 怎么理解
-- 表只是一个逻辑结构
MYISAM才有真正的物理结构 表文件,数据文件和索引文件
INNODB也有真正的物理结构 表文件单独,数据文件和索引文件是一起的,没有单独的数据文件
可以想象最底层的那一排就是数据文件,实际全表扫描就是将最底层的数据从头到尾的读取一遍
-- 第三个问题 关于执行嵌套关联查询 嵌套循环 参见官网,这样理解:第一个表取第一条记录,第二个表也是取一条,然后第三个表,最后一个表取完,在进行循环