B+树在满足聚簇索引和覆盖索引的时候不需要回表查询数据,什么是聚簇索引?
在B+树的索引中,叶子节点可能存储了当前的key值。也可能存储了当前的Key值以及整行的数据,这就是非聚簇索引和聚簇索引
在InnoDB中,只有主键索引是聚簇索引。若没有主键,则挑选一个唯一键建立聚簇索引。若没有唯一键,则隐式生成一个键来建立聚簇索引
但是若查询语句所需要的字段全部命中了索引,则即使是非聚簇索引也不必再进行回表查询建立索引的时候,都有哪些需要考虑的因素?
一般考虑到字段的使用频率
如果需要建立联合索引的话,还需要考虑联合索引中的顺序
联合索引:
多个字段同时建立一个索引。若要命中索引,需要按照建立索引时的字段顺序挨个使用,否则无法命中
- 创建的索引有没有被使用到?或者说怎么才可以知道这条语句运行很慢的原因?
MySQL提供了 explain 命令来查看语句的执行计划,在执行某个语句之前,会将该语句过一遍查询优化器,之后会拿到对语句的分析,也就是执行计划,其中包含了许多信息
- 在哪些情况下会发生针对该列创建了索引但是在查询的时候并没有使用呢?
使用不等于查询
列参与了数学运算或函数
在字符串 like 时左边是通配符,类似于 ‘%aaa’
当 mysql 分析全表扫描比使用索引快的时候不使用索引
当使用联合索引,前面一个条件为范围查询,后面的即使符合最左前缀原则,也无法使用索引
- 为什么要尽量设定一个主键?
主键时数据库确保数据行在整张表唯一性的保障,即使业务上本张表没有主键,也建议添加一个自增长的ID列作为主键
- 字段为什么要求定义为 not null?
null 值会占用更多的字节,且会在程序中造成很多与预期不符的情况
- 如果要存储用户的密码散列,应该使用什么字段进行存储?
密码散列、盐等固定长度的字符串应该使用 char 而不是 varchar 来存储
可以节省空间且提高检索效率
