问题清单
-
为什么要给表加上主键?
- 如果不加主键,这些数据在磁盘上是无序的分布状态。所以我们在创建表的时候都需要指定主键。
- mysql的innodb表,如果没有指定主键,会默认设置一个自增字段做为主键。
-
聚集索引与非聚集索引的区别
- 聚集索引的叶节点就是数据,而非聚集索引的叶节点是主键,非聚集索引是指向主键的索引。通过聚集索引查询数据,只需要一次查询,非聚集索引需要两次。
- 聚集索引的查询、排序速度优于非聚集索引,插入速度慢于非聚集索引。
-
主键为什么要保持趋势递增?
- 如果没有主键,并且也没有一个趋势递增的唯一键,那么所有这些表都会依赖一个全局序列计数器生成的ROW_ID来构造一个隐式聚簇索引,这就会导致竞争从而引起性能问题。
- 如果随机主键,那么所有页都会被频繁写入,从而导致无法高效的缓存页。并且频繁的裂变还会导致页填充率不理想,从而额外占用很多的磁盘空间。
-
索引为什么选择B+树作为数据结构?
为什么选择B+树作为索引的数据结构 -
为什么加索引后会使查询变快,会使写入、修改、删除变慢?
原因很简单,因为平衡树这个结构必须一直维持在一个正确的状态, 增删改数据都会改变平衡树各节点中的索引数据内容,破坏树结构, 因此,在每次数据改变时, DBMS必须去重新梳理树(索引)的结构以确保它的正确,这会带来不小的性能开销,也就是为什么索引会给查询以外的操作带来副作用的原因。 -
什么情况下要同时在两个字段上建索引?
即为什么要使用组合索引:
- 减少索引创建的数量,节约了空间,因为组合索引其实相当于创建了多个索引
- 条件更多,减少查询的次数,以及减少结果集
- 可以实现覆盖索引
-
组合索引和最左匹配原则:Mysql联合索引最左匹配原则
-
索引失效的情况以及解决方法
- 使用or连接的两个字段,如果两个字段都是索引字段索引才会生效,否则索引无效
- 以”%”开头的LIKE语句,模糊匹配:红色标识位置的百分号会导致相关列的索引无法使用
- 数据类型出现隐式转化(如varchar不加单引号的话可能会自动转换为int型,会使索引无效,产生全表扫描。)
- 在索引列上使用IS NULL 或IS NOT NULL操作。索引是不索引空值的,所以这样的操作不能使用索引,可以用其他的办法处理,例如:数字类型,判断大于0,字符串类型设置一个默认值,判断是否等于默认值即可
- 在索引字段上使用not,<>,!=,eg<> 操作符(不等于):不等于操作符是永远不会用到索引的,因此对它的处理只会产生全表扫描。 用其它相同功能的操作运算代替,如 a<>0 改为 a>0 or a<0
- 对索引字段进行计算操作或使用函数
-
索引优化策略
-
BTree索引和hash索引的区别 参考:# MySQL BTree索引和hash索引的区别
-
其他
- 红黑树的原理
- 前缀索引和前缀树
- 什么是全文索引,全文索引中的倒排索引是什么原理?
- 对数据库表中的大文本字段加上的根据关键字查询的一种索引。
- 一般的索引使用的是关键字完全匹配,但是这种大文本的关键字匹配很耗时间,所以全文索引利用倒排索引机制。建立,单词-文档机制,数据库会建立一个单词表和文档表,在文档里出现过的单词都会放入单词表中,并且记录下这个单词在文档里出现的位置以及频率。在查询的时候,从单词表里查询出匹配的文档列表即可。
TIPS
参考:深入浅出数据库索引原理
参考:MySQL索引原理及慢查询优化
参考:mysql 聚簇索引 和聚簇索引 (二级索引)的 那些事
参考:数据库常见知识点总结