

我们先分析一下表结构。
假设学号是表中的唯一主键,那由学号就可以确定姓名和年龄了,但是却不能确定课程名称和成绩。
假设课程名称是表中的唯一主键,那由课程名称就可以确定学分了,但是却不能确定姓名、年龄和成绩。
虽然通过学号和课程名称的联合主键,可以确定除联合主键外的所有的非主键值,但是基于上述两个假设,也不符合第二范式的要求。


空间换时间


区别:
1.非叶子节点并不存储真正的 data
2.为所有叶子结点增加了一个链指针
如果索引值和行记录分开存放就属于非聚簇索引。
B+Tree的叶子节点存放主键索引值和行记录就属于聚簇索引。
B+Tree的叶子节点存放的是主键字段值就属于主键索引;
如果存放的是非主键值 就属于辅助索引(二级索引)。
在InnoDB引擎中,主键索引采用的就是聚簇索引结构存储。
组合索引,区分度高的,查询度高的在前面;
根据where 条件来确定 ; 最左匹配原则
一个索引包含(或者说覆盖)所有需要查询的字段的值
select * from tableA join (
select a as tempa from tableA where c like '%CDS1606080014%'
) b on tableA.a= b.tempa;
force index(indexa,indexb)
强制索引并不会百分百生效,特别是有排序的情况;允许多个,但是不会两个都使用(索引合并)
可以采用union方式来使用多个索引
MySQL可以使用同一个索引满足排序(ORDER BY)和查询(WHERE)操作,因此如果可以,设计索引的时候尽可能考虑同时满足两种任务
前提
只有当索引列顺序和ORDER BY的列顺序完全一致
如果存在表关联,则只有当ORDER BY引用的字段全部为第一个表是,才能使用索引排序
最左前缀
例外
有一种特殊的情况即使不满足最左法则,MySQL也能通过索引来实现排序,如果WHERE或者JOIN中对索引中某些列指定为常量,那么可以弥补这个最左法则!
之前的文章已经有了,就不再重述索引失效
下一篇:PDO数据库操作