- 谈谈你对MySQL索引的理解
- 是一个单独的、存储在磁盘上的数据结构,包含对数据表里所有记录的引用指针。
 - 不同的存储引擎支持的索引不同
 - 优点
- 唯一索引可以保证每一行数据的唯一性
 - 加快查询速度
 - 加速表之间的连接
 
 - 缺点:
- 创建和维护索引要耗费时间
 - 索引需要占用磁盘空间
 - 对表数据进行增删改查的时候索引也要动态维护,降低速率
 
 
 - 索引有哪几种
- 普通索引和唯一索引
- 普通索引:基本索引类型,允许插入重复值和空值
 - 唯一索引:索引列的值必须唯一,允许有空值;
- 主键索引是特殊的唯一索引,不允许有空值
 
 
 - 单列索引和组合索引
- 单列索引:一个索引只包含一个列
 - 组合索引:在表的多个字段组合上创建的索引,遵循最左前缀集合。
 
 - 全文索引
- MySQL中只有MyIsam支持,类型为FULTEXT
 
 - 空间索引
- 对空间数据类型的字段建立的索引,MySQL中只有MyIsam支持
 
 
 - 普通索引和唯一索引
 如何创建和保存MySQL索引
在创建表的时候创建索引
- 语法
create table xxx [col_name data type][unique|fulltext|spatial][index|key][index_name](col_name [length]) [ASC|DESC]--unique fulltext spatial为可选参数,分别表示唯一索引、全文索引和空间索引--示例CREATE TABLE t1(id INT NOT NULL,name CHAR(30) NOT NULL,UNIQUE INDEX UniqIdx(id))
 
- 语法
 在已存在的表上创建索引
- 语法 ```sql —可以使用ALTER或者CREATE ALTER TABLE book ADD UNIQUE INDEX UNIQidIdx(bookId)
 
CREATE UNIQUE INDEX UniqidIdx ON book (bookId)
4. MySQL怎么判断要不要加索引1. 当唯一性是某数据的特征时,指定唯一索引1. 频繁进行排序或分组的列上建立素索引5. 如何判断索引是否生效1. 用EXPLAIN语句```sqlEXPLAIN SELECT * FROM WHERE index_name=xxx;
- 何如评估一个索引是否合理
- 避免对经常更新的表创建过多索引
 - 数据量小的表最好不要用索引
 - 在不同的值较多的列上建立索引
 - 唯一索引建立在唯一性的数据上
 - 在频繁分组或排序的列上建立建立索引
 
 - 索引失效怎么解决
- 遵循最左前缀原则
 - 不在索引上做任何操作
 - 尽量使用覆盖索引
 - 少用or
 - 字符串不加单引号会导致索引失效
 - 检查!=<>符号处
 - 检查LIKE以通配符开头处(LIKEname)
 
 - 哪些字段不适合创建索引
- 频繁更新的
 - where中用不到的
 - 数据少的表
 - 数据重复且分布均匀
 - 参与列计算的
 
 - 索引的实现原理
MySQL中索引是在存储引擎层实现的- MyISAM索引实现
- B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址
 - 辅助索引是一颗B+Tree,data域保存数据记录的地址
 
 - InnoDB
- 也是用B+Tree但实现原理不同。InnoDB的数据文件本身就是索引文件
 - InnoDB的辅助索引data域存储相应记录主键的值而不是地址
 
 
 - MyISAM索引实现
 介绍一下数据库索引的重构过程
- 什么时候需要重建索引
- 表频繁发生改、删操作
 - rowid产生变化
 
 - 怎么判断该不该重建索引
- 看索引是否严重倾斜,浪费了空间
 - 索引深度>=4时
 
 如何重构索引
drop之后再创建
drop index index_name
直接重建索引
alter index index_name rebuild
rebuild重建索引的过程
- 读取原索引中的数据构建新的索引
 - 产生一个临时日志表记录所有rebuild online时索引的变化
 - 新的索引构建完以后,把日志表的内容维护到新的索引
 - drop掉旧的索引
 - 注意事项
- 需要检查表空间是否足够
 - 最好在业务不繁忙的时间段
 
 
- 什么时候需要重建索引
 - MySQL索引为什么用B+树
- 所有记录节点都是按照键值的大小魂虚存放在同一层的叶子节点
 - 高扇出性,速率优势
 
 - 联合索引的存储结构是什么,它的有效方式什么
- 本质上还是B+Tree,但是键值数量>=2
 - 遵循最左前缀集合
 
 - MySQL的Hash索引和B树索引有什么区别?(面试真题)
- hash索引等值查询更快,但无法范围查询
 - hash索引不支持使用索引进行排序
 - hash索引不支持模糊查询以及多列查询的最左匹配
 - hash索引避免不了回表查询数据
 - hash索引不稳定,不可预测
 
 - 聚簇索引和非聚簇索引有什么区别?
无论何种索引,大小都为16KB且不能更改- 聚簇索引是根据主键创建的一棵B+树,聚簇索引的叶子节点存放了表中的所有记录
 - 非聚簇索引索引是根据聚簇索引键创建的一棵B+树,叶子节点仅存放索引键值,以及该索引键值指向的主键
 
 - 什么是联合索引
- 联合索引对表上的多个列进行索引,本质还是B+Tree,遵循最左前缀
 
 - select in中如何使用索引
- 如果字段类型为字符串 ,要给in查询中的数值和字符串加引号
 - 字段为int不需要加引号
 
 - 模糊查询中如何使用索引?
like '%8787aa'不能用索引
 
