首页 > 编程知识 正文

数据库基础面试题,数据库怎么创建索引

时间:2023-05-06 11:48:10 阅读:9708 作者:4517

数据库常见问题(1) ——数据库架构和索引模块1 .如何设计数据库架构问题1.1关系数据库? 2 .索引模块问题2.1为什么要使用索引? 问题2.2什么信息为索引? 问题2.1索引的数据结构? 扩展1 :可以通过减少io执行次数来优化索引查询效率。 问题2.1密集索引和稀疏索引有什么区别? 扩展mysql的InnoDB和MyISAM存储引擎

1 .数据库体系结构问题1.1如何设计关系数据库?

这个问题回答了设计关系数据库所需的模块。

答案:

关系数据库为http://www.Sina.com/http://www.Sina.com /,将数据持久化到存储设备,其中程序实例为存储模块模块,分析优化运行效率的操作数据库文件系统sql语句; 记录操作的程序实例模块;存储管理模块,进行多用户管理; 灾难恢复缓存模块优化数据查询效率SQL解析使数据库支持并发操作日志管理

2 .索引模块问题2.1为什么要使用索引? a )正在搜索数据量大的表,避免进行所有表扫描,减少IO访问量。

问题2.2什么信息为索引? 答:可以唯一识别的键,如主键、唯一键等

问题2.1索引的数据结构? 答:有主流的b树,还有混列结构、BitMap,但Mysql不支持BitMap索引,基于InnoDB和MyISAM引擎的Mysql不支持散列。

扩展1 :可以通过减少io执行次数来优化索引查询效率。 1、双股搜索树

缺点是删除或添加后,树容易老化,树的深度变大,io次数无法优化

2、b树

b树定义:

1 .根节点至少包括两个孩子。

2 .每个节点最多有m个孩子(m=2)。 (图m=3)

3 .除根节点和叶节点外,每个节点至少有ceil(m/2 )人的子女。

4 .所有叶子的节点在同一层

5 .指向非叶节点的指针: p[1]、p[2]…p[M]中,p[1]指向的数据均小于k[1],p[M]指向的数据均大于K[M-1],其他

缺点是必须在每个节点上存储实际的数据行。 b树中每个节点的元素可以视为一次I/O读取,树的高度表示最多的I/O次数。 在相同数量的总元素数中,每个节点的元素数越多,高度越低,查询所需的I/O次数越少。

3、b树

定义b树: b树是b树的变体,定义基本相同。 但是

1 .叶以外的节点的部分树指针和关键字的个数相同。

2 .除叶子以外的节点的子树指针p[i]是指关键值为[k[i],k[i 1]的子树

3 .非叶节点仅用于索引,数据均存在于叶节点中。

4 .所有叶节点上有一个链指针指向下一个叶节点。

叶以外的节点中只存储索引,不存储数据,只有叶的节点存储数据。 每个非叶节点在页面上存储的索引数更多,树的高度更低,磁盘的读/写成本更低。 所有叶节点都有一个指针,指向下一个叶节点,可以横向跨子树统计,范围查询比较有利。

4、混列索引(mysql不显式支持) ) ) ) ) )。

混列索引不适合范围搜索,仅满足“=”、“in”。

hash索引不适合排序

散列索引在散列值相等的数据较多时会劣化

5、位图索引(mysql不支持) ) ) ) ) )。

如果数据类型固定,则位图索引是合适的

缺点:锁定范围广,不适合并发高场景

问题2.1密集索引和稀疏索引有什么区别? 密集索引文件中的每个搜索代码值(下图中的数据记录)对应于索引值)索引条目。 稀疏索引文件只为索引代码(下图中的数据记录)的部分值创建索引条目)

扩展mysql的InnoDB和MyISAM存储引擎如何索引实现MyISAM和InnoDB两个存储引擎权限划分

1 )主键索引:

MyISAM引擎使用B Tree作为索引结构,叶节点的data域中存储有数据记录的地址。 下图是MyISAM主键索引的原理图。

这里,假设表共有3列,并且以Col1为主键,则图MyISAM1为myisam表的主索引(Primary key )的图像。 可以看到,MyISAM索引文件只存储数据记录的地址。

2 )辅助索引(次密钥) )

在MyISAM中,“主索引”和“次索引”在结构上没有差异。 但是,key在主索引中必须是唯一的,并且次索引中的key可以重复。 如果在Col2中创建了辅助索引,则该索引的结构如下图所示。

同样1粒B Tree、data域保存数据的记录

的地址。因此,MyISAM中索引检索的算法为首先按照B+Tree搜索算法搜索索引,如果指定的Key存在,则取出其data域的值,然后以data域的值为地址,读取相应数据记录。

MyISAM的索引方式也叫做“非聚集”的,之所以这么称呼是为了与InnoDB的聚集索引区分。

InnoDB索引实现

然InnoDB也使用B+Tree作为索引结构,但具体实现方式却与MyISAM截然不同.

1)主键索引:

​ MyISAM索引文件和数据文件是分离的,索引文件仅保存数据记录的地址。而在InnoDB中,表数据文件本身就是按B+Tree组织的一个索引结构,这棵树的叶节点data域保存了完整的数据记录。这个索引的key是数据表的主键,因此InnoDB表数据文件本身就是主索引。


​ (图inndb主键索引)

(图inndb主键索引)是InnoDB主索引(同时也是数据文件)的示意图,可以看到叶节点包含了完整的数据记录。这种索引叫做聚集索引。因为InnoDB的数据文件本身要按主键聚集,所以InnoDB要求表必须有主键(MyISAM可以没有),如果没有显式指定,则MySQL系统会自动选择一个可以唯一标识数据记录的列作为主键,如果不存在这种列,则MySQL自动为InnoDB表生成一个隐含字段作为主键,这个字段长度为6个字节,类型为长整形。

2)InnoDB的辅助索引

​ InnoDB的所有辅助索引都引用主键作为data域。例如,下图为定义在Col3上的一个辅助索引:

​ InnoDB 表是基于聚簇索引建立的。因此InnoDB 的索引能提供一种非常快速的主键查找性能。不过,它的辅助索引(Secondary Index, 也就是非主键索引)也会包含主键列,所以,如果主键定义的比较大,其他索引也将很大。如果想在表上定义 、很多索引,则争取尽量把主键定义得小一些。InnoDB 不会压缩索引。

​ 文字符的ASCII码作为比较准则。聚集索引这种实现方式使得按主键的搜索十分高效,但是辅助索引搜索需要检索两遍索引:首先检索辅助索引获得主键,然后用主键到主索引中检索获得记录。

​ 不同存储引擎的索引实现方式对于正确使用和优化索引都非常有帮助,例如知道了InnoDB的索引实现后,就很容易明白为什么不建议使用过长的字段作为主键,因为所有辅助索引都引用主索引,过长的主索引会令辅助索引变得过大。再例如,用非单调的字段作为主键在InnoDB中不是个好主意,因为InnoDB数据文件本身是一颗B+Tree,非单调的主键会造成在插入新记录时数据文件为了维持B+Tree的特性而频繁的分裂调整,十分低效,而使用自增字段作为主键则是一个很好的选择。

InnoDB索引MyISAM索引的区别:

一是主索引的区别,InnoDB的数据文件本身就是索引文件。而MyISAM的索引和数据是分开的。

二是辅助索引的区别:InnoDB的辅助索引data域存储相应记录主键的值而不是地址。而MyISAM的辅助索引和主索引没有多大区别。

InnoDB和MyISAM的简介:

InnoDB存储引擎:InnoDB是一款支持事务,行级锁,外键,非锁定读等特性的存储引擎,其设计目标主要面向在线事务处理(OLTP online transaction processing)的应用。InnoDB的索引和数据是存放在一起的,格式为 *.ibd。InnoDB通过使用多版本并发控制(MVCC)来实现高并发性,实现SQL标准的四种隔离级别:RU、RC、RR、SERIALIZABLE,默认为RR。同时使用一种被称为next-key locking的策略来避免幻读(phantom)现象的产生(关于幻读后面会讲)。为了满足一些高性能的需求,innodb实现了插入缓冲、二次读、自适应哈希、预读等特性。

MyISAM存储引擎:MyISAM存储引擎不支持事务、表锁设计,支持全文索引,主要面向一些(OLAP On-Line Analytical Processing联机分析处理)数据库应用。MyISAM存储引擎另一个与众不同的地方是它的缓冲池只缓存索引文件,而不是缓冲数据文件(数据文件的缓存交由操作系统本身来完成)。MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI则用来存放索引文件

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。