1. 谈谈你对MySQL索引的理解
      1. 是一个单独的、存储在磁盘上的数据结构,包含对数据表里所有记录的引用指针。
      2. 不同的存储引擎支持的索引不同
      3. 优点
        1. 唯一索引可以保证每一行数据的唯一性
        2. 加快查询速度
        3. 加速表之间的连接
      4. 缺点:
        1. 创建和维护索引要耗费时间
        2. 索引需要占用磁盘空间
        3. 对表数据进行增删改查的时候索引也要动态维护,降低速率
    2. 索引有哪几种
      1. 普通索引和唯一索引
        1. 普通索引:基本索引类型,允许插入重复值和空值
        2. 唯一索引:索引列的值必须唯一,允许有空值;
          1. 主键索引是特殊的唯一索引,不允许有空值
      2. 单列索引和组合索引
        1. 单列索引:一个索引只包含一个列
        2. 组合索引:在表的多个字段组合上创建的索引,遵循最左前缀集合。
      3. 全文索引
        1. MySQL中只有MyIsam支持,类型为FULTEXT
      4. 空间索引
        1. 对空间数据类型的字段建立的索引,MySQL中只有MyIsam支持
    3. 如何创建和保存MySQL索引

      1. 在创建表的时候创建索引

        1. 语法
          1. create table xxx [col_name data type]
          2. [unique|fulltext|spatial][index|key][index_name](col_name [length]) [ASC|DESC]
          3. --unique fulltext spatial为可选参数,分别表示唯一索引、全文索引和空间索引
          4. --示例
          5. CREATE TABLE t1(
          6. id INT NOT NULL,
          7. name CHAR(30) NOT NULL,
          8. UNIQUE INDEX UniqIdx(id)
          9. )
      2. 在已存在的表上创建索引

        1. 语法 ```sql —可以使用ALTER或者CREATE ALTER TABLE book ADD UNIQUE INDEX UNIQidIdx(bookId)

    CREATE UNIQUE INDEX UniqidIdx ON book (bookId)

    1. 4. MySQL怎么判断要不要加索引
    2. 1. 当唯一性是某数据的特征时,指定唯一索引
    3. 1. 频繁进行排序或分组的列上建立素索引
    4. 5. 如何判断索引是否生效
    5. 1. EXPLAIN语句
    6. ```sql
    7. EXPLAIN SELECT * FROM WHERE index_name=xxx;
    1. 何如评估一个索引是否合理
      1. 避免对经常更新的表创建过多索引
      2. 数据量小的表最好不要用索引
      3. 在不同的值较多的列上建立索引
      4. 唯一索引建立在唯一性的数据上
      5. 在频繁分组或排序的列上建立建立索引
    2. 索引失效怎么解决
      1. 遵循最左前缀原则
      2. 不在索引上做任何操作
      3. 尽量使用覆盖索引
      4. 少用or
      5. 字符串不加单引号会导致索引失效
      6. 检查!=<>符号处
      7. 检查LIKE以通配符开头处(LIKEname)
    3. 哪些字段不适合创建索引
      1. 频繁更新的
      2. where中用不到的
      3. 数据少的表
      4. 数据重复且分布均匀
      5. 参与列计算的
    4. 索引的实现原理
      MySQL中索引是在存储引擎层实现的
      1. MyISAM索引实现
        1. B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址
        2. 辅助索引是一颗B+Tree,data域保存数据记录的地址
      2. InnoDB
        1. 也是用B+Tree但实现原理不同。InnoDB的数据文件本身就是索引文件
        2. InnoDB的辅助索引data域存储相应记录主键的值而不是地址
    5. 介绍一下数据库索引的重构过程

      1. 什么时候需要重建索引
        1. 表频繁发生改、删操作
        2. rowid产生变化
      2. 怎么判断该不该重建索引
        1. 看索引是否严重倾斜,浪费了空间
        2. 索引深度>=4时
      3. 如何重构索引

        1. drop之后再创建

          1. drop index index_name
        2. 直接重建索引

          1. alter index index_name rebuild
      4. rebuild重建索引的过程

        1. 读取原索引中的数据构建新的索引
        2. 产生一个临时日志表记录所有rebuild online时索引的变化
        3. 新的索引构建完以后,把日志表的内容维护到新的索引
        4. drop掉旧的索引
        5. 注意事项
          1. 需要检查表空间是否足够
          2. 最好在业务不繁忙的时间段
    6. MySQL索引为什么用B+树
      1. 所有记录节点都是按照键值的大小魂虚存放在同一层的叶子节点
      2. 高扇出性,速率优势
    7. 联合索引的存储结构是什么,它的有效方式什么
      1. 本质上还是B+Tree,但是键值数量>=2
      2. 遵循最左前缀集合
    8. MySQL的Hash索引和B树索引有什么区别?(面试真题)
      1. hash索引等值查询更快,但无法范围查询
      2. hash索引不支持使用索引进行排序
      3. hash索引不支持模糊查询以及多列查询的最左匹配
      4. hash索引避免不了回表查询数据
      5. hash索引不稳定,不可预测
    9. 聚簇索引和非聚簇索引有什么区别?
      无论何种索引,大小都为16KB且不能更改
      1. 聚簇索引是根据主键创建的一棵B+树,聚簇索引的叶子节点存放了表中的所有记录
      2. 非聚簇索引索引是根据聚簇索引键创建的一棵B+树,叶子节点仅存放索引键值,以及该索引键值指向的主键
    10. 什么是联合索引
      1. 联合索引对表上的多个列进行索引,本质还是B+Tree,遵循最左前缀
    11. select in中如何使用索引
      1. 如果字段类型为字符串 ,要给in查询中的数值和字符串加引号
      2. 字段为int不需要加引号
    12. 模糊查询中如何使用索引?
      1. like '%8787aa'不能用索引