有关mysql 索引面试题的相关回答思路
什么是索引?
索引总的来说是表中一列值或多列值排序的数据结构;目的是加快数据的查询速度;
索引为什么能加快数据查询速度;
从数据的角度来说,MySQL表中的数据储存在磁盘中。查询SQL执行时现在内存中找到索引,在通过索引去磁盘查询数据;内存处理数据的速度大于磁盘;
什么是IO问题;
io 问题,翻译一下就是 input,output的问题;数据吞吐效率的问题,数据吞吐效率取决与硬件;开发人员避免io问题最有效的思路是提速:减少io次数,减少io量;能一次取完,尽量不要多次去取;
索引存储在哪?加载方式是什么?
索引在创建后最终是存储在磁盘里的;通过预加载被加载到内存中以供使用;这就是服务器宕机索引不会失效的原因;
加载方式: 当磁盘数据亮较大时,无法一次性加载到内存,便有了分块加载的方式;磁盘与内存交互时有一个最基本的逻辑单位,datapage,其大小与操作系统相关,一般4-8K,读取时可以整数倍读取;
索引是一什么数据结构存储的?为什么使用种结构?
表中的索引是一红B+存储;磁盘做分块下载时,不能一次全读完整颗树,哈希表 本质是数组j+链表,范围查询效率过低; 其他 例如红黑树,BVL树等二叉树均只能由两个分支;空间浪费严重; B树,由于子节点上也存储有数据,因此同层数下所能存储的数据没有B+树多; B+树的子节点上存储的都是键值,不存行数据,因此能存更多数据;一般三-4层的B+树足以支持千万级别数据量存储;
Mysql 一张表中可以有多少个索引?
理论上可以有很多个,个索引对应一颗b+数,一张表有多个B+数结构存在;
多个B+树的情况,数据是怎么存储的?
一张表无论有多少组索引;数据都只存储一份。绑定数据的索引叫聚簇索引,反之叫非聚簇索引。数据绑定在聚簇索引的B+树叶子节点;非聚簇索引叶子节点存储的是 聚簇索引子节点K值;
如果表没有索引数据怎么储存?
(innodb 插入数据必须有索引进行绑定,有主键选择主键,没主键选择唯一键 多个唯一键选择最先定义的唯一键,没唯一键会生个一个6字节的rowID绑定)
什么是数据库的回表?
例 select * from table where name = ‘www’;
id 为主键,name 为普通索引
查询是先去name 的B+ 树上查找ID 的值,再去id的b+树查询行数据;
查询了两次行数据,被称为回表;在查询是尽量避免回表;
什么是索引覆盖;
例 select id,name from table where name = ‘www’;
id 为主键,name 为普通索引
在name 的B+树上,查询到所需的所有数据;叫索引覆盖,推荐使用;
什么是最左匹配:
id,name, age, gender, addressid主键,name,age组合索引
select * from table where name=’zhangsan‘ and age =10:
使用聚合索引
select * from table where name=zhangsan;
不使用聚合索引
select * from table where age =10:s
不使用聚合索引
elect * from table where age =10 and name=zhangsan;
使用聚合索引