2021年MySQL面试题库
备注:本文修改于2021年6月1日
前言
MySQL是一个关系型数据库管理系统,由瑞典MySQL AB公司开发,现属于 Oracle 旗下产品。MySQL 是最流行的关系型数据库管理系统之一。MySQL所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型网站的开发都选择 MySQL 作为网站数据库。
1、MySQL有关权限的表都有哪几个?
MySQL服务器通过权限表来控制用户对数据库的访问,权限表存放在mysql数据库里,由mysql_install_db脚本初始化。这些权限表分别user,db,table_priv,columns_priv和host。下面分别介绍一下这些表的内容和作用。
表名 | 作用 |
---|---|
user权限表 | 记录允许连接到服务器的用户帐号信息,里面的权限是全局级的。 |
db权限表 | 记录各个帐号在各个数据库上的操作权限。 |
table_priv权限表 | 记录数据表级的操作权限。 |
columns_priv权限表 | 记录数据列级的操作权限。 |
host权限表 | 配合db权限表对给定主机上数据库级操作权限作更细致的控制。这个权限表不受GRANT和REVOKE语句的影响。 |
2、什么是索引?
索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。
索引是一种数据结构。数据库索引,是数据库管理系统中一个排序的数据结构,以协助快速查询、更新数据库表中数据。索引的实现通常使用B数及其变种B+数。
更通俗的说,索引就相当于目录。为了方便查找书中的内容,通过对内容建立索引形成目录。索引是一个文件,它是要占据物理空间的。
索引有哪些优缺点?
索引的优点:可以大大加快数据的检索速度,这也是创建索引的最主要的原因。通过使用索引,可以在查询的过程中,使用优化隐藏器,提高系统的性能。
索引的缺点:(1)时间方面。创建索引和维护索引要耗费时间,具体地,当对表中的数据进行增加、删除和修改的时候,索引也要动态的维护,会降低增/改/删的执行效率;(2)空间方面。索引需要占物理空间。
索引有哪几种类型?
索引类型 | 详细介绍 |
---|---|
主键索引 | 数据列不允许重复,不允许为NULL,一个表只能有一个主键。 |
唯一索引 | 数据列不允许重复,允许为NULL值,一个表允许多个列创建唯一索引。可以通过 ALTER TABLE table_name ADD UNIQUE (column)创建唯一索引;还可以通过 ALTER TABLE table_name ADD UNIQUE (column1,column2)创建唯一组合索引。 |
普通索引 | 基本的索引类型,没有唯一性的限制,允许为NULL值。可以通过ALTER TABLE table_name ADD INDEX index_name (column)创建普通索引,还可以通过ALTER TABLE table_name ADD INDEX index_name(column1, column2, column3)创建组合索引。 |
3、MySQL数据库索引的数据结构是什么?
索引的数据结构和具体存储引擎的实现有关,在MySQL中使用较多的索引有Hash索引,B+树索引等,而我们经常使用的InnoDB存储引擎的默认索引实现为:B+树索引。对于哈希索引来说,底层的数据结构就是哈希表,因此在绝大多数需求为单条记录查询的时候,可以选择哈希索引,查询性能最快;其余大部分场景,建议选择B+树索引。
提醒:在这里,需要澄清一下概念。B树,B-树,B+树有什么区别?它们有什么关系呢?其实,从数据结构来讲只有2种,也就是B-树和B+树。有时候,B-树又称为B树,他们是一个东西。请注意,B-树中间的“-”是连字符,而不是“减号”。英文中是B-Tree,翻译成中文后,也就是B树,有的翻译喜欢把连字符“-”也带着,于是就成了B-树,而B-树被有些读者误读为B减树。
1、B+树索引
MySQL通过存储引擎取数据,基本上90%的人用的就是InnoDB了,按照实现方式分,InnoDB的索引类型目前只有两种:BTREE索引和HASH索引。B+树索引是MySQL数据库中使用最频繁的索引类型,基本所有存储引擎都支持B+树索引。通常我们说的索引不出意外指的就是B+树索引。
2、B+树性质
3、哈希索引
简要说下,类似于数据结构中简单实现的HASH表(散列表)一样,当我们在MySQL中用哈希索引时,主要就是通过Hash算法(常见的Hash算法有直接定址法、平方取中法、折叠法、除数取余法、随机数法),将数据库字段数据转换成定长的Hash值,与这条数据的行指针一并存入Hash表的对应位置;如果发生Hash碰撞(两个不同关键字的Hash值相同),则在对应Hash键下以链表形式存储。
4、主键使用自增ID还是UUID?
推荐使用自增ID,不要使用UUID。因为在InnoDB存储引擎中,主键索引是作为聚簇索引存在的,也就是说,主键索引的B+树叶子节点上存储了主键索引以及全部的数据(按照顺序),如果主键索引是自增ID,那么只需要不断向后排列即可,如果是UUID,由于到来的ID与原来的大小不确定,会造成非常多的数据插入,数据移动,然后导致产生很多的内存碎片,进而造成插入性能的下降。总之,在数据量大一些的情况下,用自增主键性能会好一些。关于主键是聚簇索引,如果没有主键,InnoDB会选择一个唯一键来作为聚簇索引,如果没有唯一键,会生成一个隐式的主键。
5、什么是聚簇索引和非聚簇索引?
首先要明确一点:聚簇索引并不是一种单独的索引类型,而是一种数据存储方式。具体细节依赖于其实现方式。
MySQL数据库中InnoDB存储引擎,B+树索引可以分为聚簇索引(clustered index)和辅助索引(有时也称非聚簇索引或二级索引,secondary index,non-clustered index)。
InnoDB存储引擎中的主键索引是一种聚簇索引,而且其他的像复合索引、前缀索引、唯一索引等属于非聚簇索引,也就是辅助索引。
聚簇索引
聚簇索引就是按照每张表的主键构造一颗B+树,同时叶子节点中存放的就是整张表的行记录数据,也将聚集索引的叶子节点称为数据页。这个特性决定了索引组织表中数据也是索引的一部分,每张表只能拥有一个聚簇索引。
InnoDB存储引擎通过主键聚集数据,如果没有定义主键,InnoDB存储引擎会选择非空的唯一索引代替。如果没有这样的索引,InnoDB存储引擎会隐式的定义一个主键来作为聚簇索引。
辅助索引(非聚簇索引)
在聚簇索引之上创建的索引称之为辅助索引,辅助索引访问数据总是需要二次查找。InnoDB存储引擎的辅助索引的叶子节点并不包含行记录的全部数据,叶子节点除了包含键值外,还包含了相应行数据的聚簇索引键。