mysql面试题

数据库操纵语言:
DQL(Data Query Language):数据查询语言:Select
DCL(Data Controller Language):数据库控制语言,如rollback(回滚)
DML(Data Manipulation Language):数据库操作语言: 如 update delete 主要是对表里面数据的一个增删改
DDL(Data Definition Language):数据定义语言,主要是操作创建表,删除表,Create Drop

1.为什么设计索引
因为数据量太大,需要设计类似于字典查询目录的结构,来加快查询速率
会单独出一个索引文件

2.如何设计索引
关键值:key
文件名称
偏移量:offset

3.索引采用哪种数据结构
mysql采用B+树数据结构

为什么mysql采用b+数据结构

跟哈希数据结构相比:哈希虽然查询速率快,但是哈希无法将数据按照顺序排列起来,这样就造成了哈希在等值查询时速率高,但是在范围查询时速率低
跟二叉树比起来:随着数据量过大,二叉树的深度会过深,太深的树结构会导致磁盘的IO次数过多,降低效率

b树与b+树都是多叉树,度的概念,一个节点能最大容纳的数据量叫度

跟B树比起来:B+树的只有叶子节点会存储数据,同时叶子节点直接互相连接了起来,这样b+树只需要三层的深度就可以保存大量的数据,相比起来B树每个节点都会带数据,那么同样的深度b树做数据结构的索引,能够表示的数据量就会很少。
同时增删节点效率更高,同时b+树的叶子节点中会包含所有的数据,因为b+树的叶子节点都是有序的链表结构存储,这样它的增删效率
同时因为B+树的结构(b+树的叶子节点中会包含所有的数据,所有叶子节点互相连接),

因此他有两种查找方式,
一种是,从根节点开始的随机查找
一种是,一种是从叶子节点的范围查找和分页查找

在这里插入图片描述
索引b+树里面的key值要么为主键,要么为唯一键,要么为自生成的row_id

innodb和myisam索引的区别

同样都是以B+树为数据结构
innodb是数据直接放在索引里,索引文件后缀ibd
myISAM是索引里存放的是数据的地址 索引文件后缀MYI,数据MYD

innodb支持事务
MyISAM不支持事务

什么是聚簇索引和什么是非聚簇索引

聚簇索引,数据和索引放在一起的
非聚簇索引,数据和索引是分开放的

回表

如果创建索引的键是其他字段,那么叶子节点里存储的就是该记录的主键,获取该主键后,再通过主键索引找到对应的记录,这就是回表,相当于要查两颗b+树
举例:
如以下表,有id和name两个字段
在这里插入图片描述
当用以name字段来作为索引,会形成以下的b+树
在这里插入图片描述
当执行以下命令时候

select * from table where name = teacher.ma

他会现遍历name的B+树找到对应的主键值
再通过以下的主键索引b+树找到真正的数据值
在这里插入图片描述

索引覆盖

接上面的回表
当使用以下查询命令时,只会查询一个索引的b+树

select id from table where name = teacher.ma

最左匹配

最左匹配,是和组合索引一起使用的
组合索引:几个字段一起作为索引
所以最左匹配是在组合索引的基础上
如组合索引,用两个字段作为索引,name,age
最左匹配就是在查询的时候,如果想使用(name,age)这个组合索引,要先匹配到最左端的name才能集合(name,age)这个组合索引

索引下推

前缀索引

当某些较长的字符串做索引时(如密码),选取字符串的前几位来作为索引

4.mysql是如何实现索引的

5.mysql索引另外一种数据结构是:哈希 存储引擎为Memory
不同的存储引擎,底层索引实现有不同的数据结构
InnoDB 和 MyISAM 索引的底层数据结构为B+树
MEMORY 引擎底层的数据结构为 HASH

MySQL的事务隔离级别

首先要明确Mysql事务隔离级别要实际解决的问题
主要有以下待解决的问题

基本的sql语句

增:
insert into

insert into table(列1,列2) values(值1,值2)

删: (是删除表中的某一行)
delete

delete from  table where  列 = '值'

改:
update…set

update table set 列=新值 where 列 = 值

查:
select

select 字段名 from where 字段名 = 值

模糊查询

练习各种sql查询语句

三个表 dept(部门表) dname(员工姓名) salgrade(工资等级)

1.查询员工的年薪
tip:薪水乘以12

SELECT
	ename,
	sal * 12 AS `annule sal` 
FROM
	emp;

2.查询员工总收入
tip:薪水乘以12+津贴
注意津贴是有空值(null)的,null也要参与计算,所有对于有空值的列要注意

SELECT
	ename,
	sal * 12 AS `annule sal` 
FROM
	emp;

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值