- 谈谈你对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语句
```sql
EXPLAIN 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'
不能用索引