mysql索引

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值