mysql 面试题

mysql 面试题

能说下什么是索引? 索引有的种类有哪些?

索引(index)是帮助数据库高效获取数据的数据结构。 索引是在基于数据库表创建的,它包含一个表中某些列的值的以及记录对应的地址,并且把这些存储在一个数据结构中。最常见的就是 哈希表 B+树作为索引。 InnoDB引擎 默认就是B+树

常见使用 哈希表, B+树作为索引

MySQL 索引具体采用哪种数据额结构呢?


InnoDB 使用 B+ 数的索引模型,那么你知道为什么采用B+树么?这和hash索引比较起来有什么优缺点呢?

由于索引是存在磁盘中,当索引非常大的时候,比如达到几个G的时候,无法一次性架子啊到内存中,所以数据中的索引使用的是查找效率更高的属性结构。
B+ 树是平衡多路查找树,是为磁盘等外储存设备设计的一种平衡查找树

系统从磁盘读取数据到内存的时候是以磁盘块(block) 为基本单位的,位于同一个磁盘块中的数据会被一次性读取出来,InnoDB存储引擎中有页(Page)的概念,页是其
磁盘管理的最小单位,InnoDB 存储引擎默认每个页的大小为16KB, 可通过采纳数innodb_page_size 设置页的大小,InnoDB在把磁盘数据读入到磁盘时会以页为基本单位,在查询数据时如果一个页中的每条都能有助于定位数据记录的位置,这样将会减少磁盘I/O 次数,提高查询效率

B+ 树使用有序数组链表+平衡多叉树改良了B树的有序数组 + 平衡多叉树; B+ 树的关键字全部存放在叶子节点中,非叶子节点用来做索引,而叶子节点中有一个指针指向下一个叶子节点。 做这个优化的目的是为了提高区间访问性能。

数据库索引采用B+树的主要原因是B树在提高了磁盘IO性能的同时并没有解决元素遍历效率低下的问题。正是为了解决这个问题,B+树应运而生。B+树 只要遍历叶子节点就可以实现整棵树的遍历。而且在数据库中基于范围的查询是非常频繁的,也是B+树额优势所在。

什么情况下适合建索引?


一般来说  在 where  join 和 order by 中出现的列需要建立索引

联合索引遵循最左前缀原则


哈希索引:

哈希索引适合等值查询,但是无法进行范围查询;
哈希索引没办法利用索引完成排序;
哈希索引不支持多列联合索引的最左匹配规则;
如果大量重复键值的情况,哈希索引的效率会很低,可能存在哈希碰撞的问题;

B+树的叶子节点可以存那些东西?

InnoDB 的B+树可能存储的是整行数据,也可能是主键的值,索引 B+树的叶子存储了整行数据的主键索引,也被称之为聚餐索引。
而索引B+树 的叶子节点存储了 主键的值的是非主键索引,也被称之为非聚簇索引

聚簇索引和非聚簇索引:

主键索引查询知会查一次,而非主键索引需要回表查询多次,通过覆盖索引也可以只查询一次,覆盖索引指一个查询语句的执行只用索引中就能够取得,不必从数据表中读取。
MySQL 只需要通过索引就可以返回查询所需的数据,这样避免了查到索引后再返回表操作,减少I/O 提高效率

聚簇索引(聚集索引):以InnoDB作为存储引擎的表,表中的数据都会有一个主键,即使不创建主键,系统也会自动帮你创建一个隐式的主键

非聚簇索引(非聚集索引): 以主键以为的列值作为键值构建的B+树索引,我们称之为非聚簇索引 ;非聚簇索引 的叶子节点不存储表中的数据的,而是存储列所对应的主键,想要查找数据的话,还需要根据主键再从聚簇索引中去查找,这个根据聚簇索引查找的过程 我们就称为回表。

如果每天几百万数据 ,一个月就是几千万了,有没有对于查询做的一些优化呢?

考察点: 
1.对分库分表 高并发系统设计的理解,是否有真实高并发项目开发经验
2. 了解面试者对中间件的理解,市场主流中间件的优缺点,以及如何选择

为什么 分库表表 (设计高并发系统的时候,数据库层面该如何设计)


用过那些分库分表的中间件?不同的分库分表中间件都有那些优点和缺点?


你们具体是如何对数据库进行垂直拆分或水平拆分的


分库分表中间件

常见的中间件:
Cobar :阿里开源B2B 团队
TDDL:  淘宝团队
Atlas : 360 开源
Sharding-jdbc: 当当开源的
Mycat : 基于Cobar 改造

Sharding-jdbc: 采用 client 层方案的优点在于不用部署,运维成本低,不需要代理层的二次转发请求,性能很高,但是如果遇到升级啥的需要各个系统重新升级版本再发布,各个系统都需要耦合Sharding-jdbc的依赖   ,用于中小型公司

MyCat : 基于 proxy 层方案的优点在于需要部署,自己运维一套中间件,运维成本高,但是好处在于中间件对于各个项目都是透明的,如果遇到升级之类的在中间件搞就行了。用于中大型公司

分库分表关注的技术问题:

分片建和分片规则选取问题
如何避免所有库扫描问题
分库分表中间件选型问题
分布式全局唯一ID问题
跨库Join 问题
跨库事务的问题,跨分片事务的问题
跨库排序分页的问题
数据迁移 扩容等问题 (一般单个分片 单表数据量 不要超过1000万)

你可能感兴趣的:(mysql,mysql,b树,数据结构)