【面试高频】MySQL数据库索引是什么? 数据库索引如何创建?数据库的三范式是什么?如何做 MySQL 的性能优化? MySQL 的行锁和表锁?为什么索引提高检索速度?数据库的事务隔离?数据库索引的种

首先我们来说一下MySQL数据库-数据库操作系统:数据库操作系统(DBMS)的组成

  • 数据库DB
  • 表 TABLE(列 Column)
  • 数据 data

SQL的分类(CRUD):

  • DDL:数据库定义语言-DataBase Definition Language
  • DML:数据库操作语言-DataBase Manipulation Language
  • DQL:数据库查询语言-DataBase Query Language
  • DCL:数据库控制语言-DataBase Control Language

DATABASE::

-创建:
CREATE DATABASE 数据库名
-查询:
SHOW DATABASES 查看数据库列表
SHOW CREATE DATABASE 数据库名:查看数据库
SELECT DATABASE() 查看当前数据库
-删除:
DROP DATABASE 数据库名
-使用:
USE 数据库名

TABLE:

-创建:
CREATE TABLE 表名(列名 数据类型 约束, 列名2 数据类型2 约束2)
-查询:
SHOW TABLES:查看所有表格(当前数据库)
SHOW CREATE TABLE 表名:查看任意的表
DISC 表名: 查看表的结构
-修改:
ALTER TABLE 表名 ADD 列名 数据类型 约束 :添加一列
ALTER TABLE 表名 MODIFY 列名 数据类型 约束:修改一列的数据类型
ALTER TABLE 表名 CHANGE 列名 新列名 数据类型 约束:修改一列的列名
ALTER TABLE 表名 DROP 列名:删除一列
ALTER TABLE 表名 CHARACTER SET 字符集:修改表的字符集
REMANE TABL 表名 TO 新表名:修改表名称
-删除:
DROP TABLE 表名

DML(增删改)
【注意:DML是针对表格中的数据的】

-INSERT INTO 表名(列1,列2…) VALUES(值1,值2…)
插入新的一行并给列1,列2…赋值
-INSERT INTO 表名 VALUES(值1,值2…)
插入新的一行,并给所有列赋值

删除:

-DELETE FROM 表名 WHERE 条件
删除符合条件的行
-DELETE FROM 表名
删除表中的所有数据
-TRUNCATE TABLE 表名
删除表,并重新创建一个一样的表
!!!注意:TRUNCATE方式删除表中的数据不能被事务恢复而DELETE可以

更新(改)

-UPDATE 表名 SET 列名1=值1,列名2,值2 WHERE 条件
更新表中符合条件行中的某列的值

【面试高频】数据库索引如何创建?

普通索引创建

mysql> create index idx_userinfo on userinfo(JobType);

创建多列的组合索引:

mysql> create index idx_userinfo on userinfo(TelePhone,FullName,UserId,JobType);

【面试高频】ACID 是什么?

Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。

Consistency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。

Isolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatableread)和串行化(Serializable)。

Durability(持久性):事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

【面试高频】数据库的三范式是什么?

第一范式:强调的是列的原子性,即数据库表的每一列都是不可分割的原子数据项。
第二范式:要求实体的属性完全依赖于主关键字。所谓完全依赖是指不能存在仅依赖主关键字一部分的属性。
第三范式:任何非主属性不依赖于其它非主属性。

【面试高频】如何做 MySQL 的性能优化?

为搜索字段创建索引。
避免使用 select *,列出需要查询的字段。
垂直分割分表。
选择正确的存储引擎。

【面试高频】 MySQL 的行锁和表锁?

MyISAM 只支持表锁,InnoDB 支持表锁和行锁,默认为行锁。
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度最高。
表级锁:开销小,加锁快,不会出现死锁。锁定粒度大,发生锁冲突的概率最高,并发量最低。

【面试高频】 索引的本质是什么?索引有什么优点,缺点是什么?

索引是帮助MySQL高效获取数据的数据结构。因此,索引的本质是一种数据结构。
* 在数据之外,数据库系统还可以维护满足特定查找算法的数据结构,这些数据结构
* 以某种方式指向真实数据,
* 这样就可以在这些数据结构上实现高级查找算法,这种数据结构就是索引。

【面试高频】为什么索引提高检索速度?

索引做了些什么可以让我们查询加快速度呢?
其实就是将无序的数据变成有序(相对):
要找到id为8的记录简要步骤:
很明显的是:没有用索引我们是需要遍历双向链表来定位对应的页,现在通过"目录"就可以很快地定位到对应的页上了!
其实底层结构就是B+树,B+树作为树的一种实现,能够让我们很快地查找出对应的记录。

【面试高频】索引的优缺点?

优点:
1、提高数据检索效率,降低数据库的IO成本;
2、通过索引对数据进行排序,降低了数据排序的成本,降低了CPU的利用率;

缺点:
1、索引实际上也是一张表,索引会占用一定的存储空间;
2、更新数据表的数据时,需要同时维护索引表,
因此,会降低insert、update、delete的速度;

【面试高频】数据库的事务隔离?

MySQL 的事务隔离是在 MySQL. ini 配置文件里添加的,在文件的最后添加:

transaction-isolation = REPEATABLE-READ

可用的配置值:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE

  • READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。

  • READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。

  • REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。

  • SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
    ①. 如果不考虑隔离性,事务存在3种并发访问问题
    1、脏读:B事务读取到了A事务尚未提交的数据
    2、幻读/虚读:一个事务中两次读取的数据的数量不一致
    3、不可重复读:一个事务中两次读取的数据的内容不一致

②. 数据库的隔离级别
1、read uncommitted : 读未提交 :哪个问题都不能解决
2、read committed:读已提交 :可以解决脏读 —- oracle默认的
3、repeatable read:可重复读:可以解决脏读和不可重复读 —mysql默认的
4、serializable:串行化:可以解决脏读不可重复读和虚读—相当于锁表

【面试高频】数据库索引的种类?

唯一索引:
唯一索引是不允许其中任何两行具有相同索引值的索引。当现有数据中存在重复的键值时,大多数数据库不允许将新创建的唯一索引与表一起保存。数据库还可能防止添加将在表中创建重复键值的新数据。例如,如果在employee表中职员的姓(lname)上创建了唯一索引,则任何两个员工都不能同姓。

主键索引

数据库表经常有一列或多列组合,其值唯一标识表中的每一行。该列称为表的主键。在数据库关系图中为表定义主键将自动创建主键索引,主键索引是唯一索引的特定类型。该索引要求主键中的每个值都唯一。当在查询中使用主键索引时,它还允许对数据的快速访问。

聚集索引

在聚集索引中,表中行的物理顺序与键值的逻辑(索引)顺序相同。一个表只能包含一个聚集索引。如果某索引不是聚集索引,则表中行的物理顺序与键值的逻辑顺序不匹配。与非聚集索引相比,聚集索引通常提供更快的数据访问速度。聚集索引和非聚集索引的区别,如字典默认按字母顺序排序,读者如知道某个字的读音可根据字母顺序快速定位。因此聚集索引和表的内容是在一起的。如读者需查询某个生僻字,则需按字典前面的索引,举例按偏旁进行定位,找到该字对应的页数,再打开对应页数找到该字。这种通过两个地方而查询到某个字的方式就如非聚集索引。

非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 ,
再使用主键的值通过聚集索引查找到需要的数据

索引列

可以基于数据库表中的单列或多列创建索引。多列索引可以区分其中一列可能有相同值的行。如果经常同时搜索两列或多列或按两列或多列排序时,索引也很有帮助。例如,如果经常在同一查询中为姓和名两列设置判据,那么在这两列上创建多列索引将很有意义。

【 问题 】一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 MySQL 数据库,又插入了一条数据,此时 id 是几?

  • 表类型是 MyISAM ,那 id 就是 8。
  • 表类型是 InnoDB,那 id 就是 6。
    InnoDB 表只会把自增主键的最大 id 记录在内存中,所以重启之后会导致最大 id 丢失。

DQL(查询):

单表
-基本查询:
SELECT 列1,列2… FROM 表名 WHERE 条件 GROUP BY 列名 HAVING 条件 ORDER BY 列名 ASC/DESC LIMIT index,rows

-DISTINCT关键字:
可以使用DISTINCT关键字来去重
SELECT DISTINCT 列 FROM 表名…
聚合函数
COUNT():计数
SUM():求和
AVG():求平均
MAX():求最大值
MIN():求最小值

条件查询 WHERE/HAVING:
WHERE:分组之前的条件,不接受聚合函数
HAVING:分组之后的条件,一般和聚合函数配合使用
分组查询GROUP BY

  • 分组查询显示的结果是每组的第一条数据,所以SELECT后面的列一般不包含个人信息,因为如果这样分组没有意义
  • 分组查询一般和聚合函数配合使用

排序查询ORDER BY

  • 排序查询最后要跟上排序规则 ASC/DESC
  • 排序查询如果不跟上排序规则则默认为 ASC

限制查询LIMIT
-LIMIT是限制查询的条数,有两个参数 index和rows
index:开始的索引
index的公式:(页数-1)*rows;
rows:显示的行数

发布了50 篇原创文章 · 获赞 13 · 访问量 2396

猜你喜欢

转载自blog.csdn.net/endless_Y/article/details/105063509