1.面试题,在使用mysql的索引的时候,主键要不要自增,为什么要自增
要自增。
关键点在索引的维护,eg disk 只能放4条数据,
如果不是递增的话,5是不能突然插进去的,
如果磁盘插不进,将会分裂磁盘快,整个叶子会进行分裂,造成性能的影响。
如果递增的话,就不应维护前面的结果
如何分布式的的话,就不能用自增的id了,能自增就自增, 删数据会设计合并的问题
2.mysql在删数据的时候会真的把数据删吗,不用,只是做标记,下次覆盖上去
3.聚簇索引和非聚簇索引的区别
就一句话,判断,数据跟索引是否是放在一起的,如果放在一起就是聚簇索引,如果不放在一起就非聚簇索引
innodb数据在进行插入的时候,必须要跟某个值绑定,这个值,默认是主键 ,如果没有就选择,唯一键,如果没有唯一键,则选择,6位字节的rowid,
innodb大部分情况下是聚簇索引,少部分情况是非聚簇 eg: aa.ibd 这个是innodb存储数据的格式,index和data都在一个文件里
但myisam 是讲数据和索引分开来存储的,aa.myd and aa.myi 是分别存放data 和index 两个文件,属于非聚簇索引
innodb中是一定有聚簇索引,但是其他索引都是非聚簇索引
对于myisan中只有非聚簇索引
4.问题一个表中,可以有多少个索引:n个。
5.数据索引如果是跟数据放在一起的话,那么数据会存储几分:只存一份。
6.假设表id name age gender address ,指定id 主键,name是普通索引,在整个表中会有两颗b+tree(id 主键的树 ,和name普通索引的树)
主键是跟数据放在一起的,name所在的b+tree叶子节点中,放的id的值。
7.当在做 select * from 表的时候,会找两颗树,先找name 中找id 找到行记录,
8..使用mysql索引都有原则,
面试中关于索引的技术名词,包含4个东西 :
回表,
索引覆盖
最左匹配
索引下推
eg : 表中有字段id name age gender4列中id主键name是普通index
1.回表,select* from table where name = 张三,需要遍历两颗b+tree,从非聚簇索引跳转到聚簇索引超找数据的过程,叫回表,这个过程效率不高,先从索引(name)找 到id,(普通的索引name树中只包含了一个id的数据)再找从id 找到数据。
通常我们要避免回表冲突。可以理解为回表就是从表普通索引找到主键,再由主键找具体数据的过程。
2. 索引覆盖 ,select id name from table where name = 张金丹
这个查询 中不用回表,这个sql中当非聚簇索引的叶子节点中包含了要查询的字段时,不用回表,这个过程就是索引覆盖,跟回表是个相反的过程,推荐使用,
所以是如果是某一列,整列都需要建立索引,一般只有一个列做索引,再建立索引的时候也可以建立联合索引
3.左匹配原则:
name age组合索引,查询的时候会用到索引的最左匹配。
先选省,再选市,
select * from table where name = ? and age = ?用索引
select * fromtable where name = ? 用索引
select * from table where age = ?不用组合索引 ,会全表扫描,
select * from table where age = ? and name = ?会用索引 优化器,会帮我们调整,当前sql来满足我们的某些要求
这就叫做左匹配原则
在左右索引交换位置的时候,处理器会利用优化器探测出来,两个是组合索引,依然为用索引查询。
可以理解为,如果在组合索引的时候,遇见了,定义在最左侧的索引就会使用,索引查询,例子中的name 字段索引定义在前,在通过name查询的时候都会用到索引
但是第二个(右边)定义的age字段上的索引,如果单独时候age查询数据的时候就不会使用索引
4.索引下推,在没有索引下推之前,执行的过程是,先根据name从存储引擎中拉取数据
然后根据age在server中做过滤age条件,
有了索引下推之后,执行的过程是根据,name和age整体的从存储引擎中,做数据检索,返回对应的记录不在server层做任何操作,
select * from table where name = ? and age = ?用组合索引
select * fromtable where name = ? 用组合索引
select * fromtable where age = ?不用组合索引 ,会全表扫描,
select * fromtable where age = ? and name = ?用组合索引 优化器,会帮我们调整,当前sql来满足我们的某些要求
index push down
组合索引和单例的时候,会出现索引下推,
单列的情况比较少,
5.全字段索引
当全表中的字段都是索引列的时候,无论怎么查询都为用到索引,
如果abc表中画b+tree的话,
alter table abcd add index in3 (d)
explain select * from abcd where b= 1 d = 1 不走索引
索引是个完整的庞大的知识体系
select* from ABCD where a = 1 b = 1 c = 1 d= 1
9.面试问题索引的长度,
int 本身站4个字节 ,+1 有符号的话 就加一
索引用几个长度 int 是4个字节 ,字段定义的时候允许给空加1,不允许为空不加1 (定义了notnull的不加一,)
eg:
create table test ( id int primarykey ,a int not null ,b not null, c not null)
alter table test add index i3 (abc)
explain select * fom acfd where a = 1 ,用了索引,并且,索引长度是4 ,
int的索引长度就是4 ,如果是not null则,是4,如果是null 则是5