一. 什么是索引?说一下基本原理?

索引就是目录,就好比一本新华字典,索引就是它的目录。
索引的原理就是把无序的数据变成有序的查询。

二. 索引的类型有哪些?(重点)

按数据结构分:hash索引、BTree索引。
按应用层次分:唯一索引、主键索引、普通索引、联合索引。
按数据存储和索引的逻辑分:聚集索引和非聚集索引。

三. 联合/组合索引是什么?/ 为什么联合索引不使用第一列索引则失效

联合索引就是使用多个字段建立的索引。
最左前缀原则,如果不适用第一列索引,则后面的列是无序的。所以无法使用联合索引。


四. 你知道哪些索引失效的情况 / 设置了索引但是无法使用?

  • 全盘扫描的速度比走索引快,则索引失效。
  • 联合索引不使用第一列,不符合最左前缀原则,则索引失效。
  • or语句左右的字段都建立的索引,索引有效。否则索引失效。
  • like后前缀为“%”则索引无效。

五. 使用索引查询一定能提高查询的性能吗?为什么?

不一定,因为有一个成本计算const,如果全盘扫描的成本比走索引+回表的成本低,则使用全盘扫描。
或者如果走了不必要的索引,也会导致查询变慢,而且索引需要存储空间,每当进行、插入、修改、删除操作时、都需要进行磁盘I/O来维护索引,这也会消耗查询的性能。

六. 创建索引的原则能说出哪些?

  1. 查询频繁的字段需要创建索引。
  2. 索引尽可能扩展、不要新建索引。
  3. 对于字段长度太大的不要建里索引、比如text,image、bit等。
  4. 最左前缀原则是联合索引中很重要的原则。
  5. 定义有外键的数据列一定要建里索引。


七. 创建索引的三种方式和删除索引的方式(重点)

  • ALTER TABLE TABLE_NAME ADD INDEX INDEX_NAME(列1,列2,列3…..);
  • CREATE INDEX index_name ON table_name (colunm_list);
  • CREATE TABLE table_name {

    1. username varchar(16) NOT NULL,<br /> INDEX [indexName] (username(length))<br />}

Drop Index [index_name] on table_name;

八. B树、B+树和hash索引区别?/ 数据库为什么使用B+树而不使用B树?(重点)

  • B树只适合随机检索、B+树适合随机检索和顺序检索。
  • hash索引的检索可以一次定位,查询效率比B树要高,但是hash索引不支持顺序检索。
  • B树每个节点都可以存储索引和数据。
  • B+树只有叶子节点存储索引和数据、非叶子节点只存储索引。

九. 聚集索引和非聚集索引的区别?

聚集索引:索引和数据存放在一起,都在叶子节点。
非聚集索引:索引和数据分开存放,通常情况需要回表查询。

十. 主键索引和辅助索引(二级索引)的区别?

主键索引:按照主键排序的索引树是主键索引。
辅助索引:按照非主键排序的索引树是辅助索引。

十一. 非聚集索引一定会回表查询吗?

不一定,如果所需要查询的数据全部打在索引上,也就是覆盖索引。就不需要回表。
select age from student where age<10;需要的数据全部打在索引上,则不需要回表查询。

十二.覆盖索引和索引下推?

覆盖索引:基于二级索引,在一个查询语句中,索要查询的数据,在二级索引中可以全部拿到,则不需要回表。这种就是覆盖索引。
索引下推:mysql5.6对查询做了优化,比如查询一个数据,select * from student age<20 sex=man;
5.6之前的执行是,只是用第一列索引age<20,然后回表去拿数据,然后再依次判断sex=man。
5.6之后的执行,会先使用第一列索引,age<20,拿到这些索引,然后继续索引下推,使用第二列索引。再次筛选。
这样的好处是减少回表次数,提高查询效率。