Mysql中char和varchar有什么区别?
Mysql中的char是不可变的字符串,不管用多少长度都只会创建对应的空间
缺点:浪费空间
优点:存储性能高
varchar是可变的字符串,数据字符占用多少空间就使用多少空间
缺点:存储性能低
优点:节省空间
Mysql中float和double的区别是什么?
在内存中占有的字节数不同,单精度内存占4个字节,双精度占有8个字节
有效数字位数不同,单精度小数点有效位数为7位,双精度有效位数为16位
Mysql中date和datetime类型的区别?
Mysql中date中只会存储年月日
datetime会存储年月日时分秒
Mysql中sql语句执⾏的顺序?(查询语句)
Mysql中sql语句的执行顺序是
from
on
join
where
group by
having
select
order by
limit
说一下Mysql常用的存储引擎?
mysql中的执行引擎我所知道的有三个
InnoDB引擎是我们所开发所需要的数据库,这个数据库支持事务,外键,行锁
会生成两个文件,一个是frm文件存储表结构,一个是idb文件,存储数据和索引
MyISAM引擎不支持事务,外键,行锁
会生成三个文件,一个是frm文件存储表结构,一个是myd是存储数据,一个是myi存储索引
Memory是存储在内存中的,临时表
只会生成一个文件,位frm文件
说一下MySQL数据库事务的三个安全性问题?
Mysql中的三个安全性问题是
(1)脏读:读到了其他事务未提交的数据
(2)不可重复读:两次读到的数据不一致
一个事务读取到了另外一个事务update的数据
(3)幻读:两个读到的行数不一致
一个事务读取到了另外一个事务insert的数据
说一下MySQL数据库事务的隔离级别?
事务的四种隔离级别
读未提交 没有解决脏读,不可重复读,幻读
读已提交 解决了脏读,没有解决不可重复读,幻读
可重复读 解决了脏读,不可重复读,没有解决幻读
串行化 解决了上面的所有问题
谈谈对Mysql存储过程的认识?
事先编译存储在数据库的一段sql语句的集合,类似与java的方法,可以把一些耗时的操作编写到存储过程中,然后使用java程序调用,减少数据在数据库和应用服务器之前的传输,提高效率
开发中用的什么数据库,group by 和order by 都是啥意思?
开发中我们使用mysql数据库,group by是分组的意思
order by是排序的意思
Inner join、left join和right join 的区别?(高频)
inner join 是内连接,将两张表根据条件连接到一起,只展示有关联条件的数据
left join 是左外连接,展示左边的数据和有关联条件的数据
right join是右外连接,展示右边的数据和有关联条件的数据
a、b两表字段相同,写一条sql将a表数据拷贝到b表中?
INSERT INTO 目标表 SELECT * FROM 来源表;
Mysql数据库的三大范式是什么?
1nf
2nf
3nf
Mysql中如何获取当前数据库版本?
使用select version查看版本信息
进入mysql的bin目录 mysql --version|-V
Mysql如何实现分页?
mysql实现分页使用limit 第几页 每页条数
第几页 = (当前页-1) * 每页条数
Mysql中如何给字段创建索引?
mysql创建索引
create index 索引名字 on 表名字(字段名字)
Mysql中创建索引越多越好吗?为什么?
索引不是越多越好
(1)因为索引如果多的话是需要进行维护的
(2)会降低DML语句的查询效率
说一说你们公司数据库都是如何优化的?
数据库进行优化
(1)读写分离,主从复制
(2)尽量不使用select * 避免回表
(3)给经常查询的字段添加索引
(4)不使用like语句,like语句会导致索引失效,失效的场景是前面加上%
(5)使用缓存优化查询数据库
(6)使用limit
(7)水平分表,垂直分表
(8)组合索引要符合最左前缀法则
mysql体系架构
mysql的体系架构
(1)连接层,这个层是负责客户端的连接
(2)服务层,这个层负责SQL接口(DQL,DML)
(3)存储引擎,选择引擎,INNODB,MyISAM,Memory
(4)存储层,日志文件,数据文件
Mysql数据库如何实现主从复制?如果主库出现问题了,从库怎么办?
(1)Mysql实现主从复制:
主服务器中,有Binlog文件,在进行增删改操作的时候,binlog文件就修改了,将修改的binlog文件的内容发送给从服务器
从节点接收到要修改的内容之后,将要修改的内容写到从节点的relaylog文件中
从节点的sql线程读取relaylog文件,执行增删改操作,保证一致性
(2)主库出现问题,从库怎么办?
半同步复制,从库写入日志,给主库返回ack,有至少一个从库返回ack就认为操作完成
全同步复制,从库写入日志,给主库返回ack,全部的从库返回ack就认为操作完成
Mysql中常用的几种约束?
mysql中知道的约束,约束就是确保表数据的完整性,对列做出限制
主键约束
外键约束
唯一约束
非空约束
请介绍下你所知道的二叉树
简单的二查树 就是度为2的树,有两个节点,左节点和右节点
二叉搜索树 就是左节点小于根节点,右节点大于根节点
平衡二查搜索树(1)AVL树,是左右字数相差高度不超过2
(2)红黑树的五个特点 1.节点不是红的就是黑的
2.根节点是黑的
3.两个相连的节点不能是红色的红色节点的子节点一定是黑色的
4.从任意节点到叶子节点的,黑色节点的个数是一样
5.外部节点是黑色的
请简单介绍下B数
B树 多路平衡搜索树,如果介为m
一个节点可以存储多个数据 [m/2]-1~m-1
一个节点可以有多个子数 [m/2]~m (向上取整)
在B树种有介的概念,介就是这个B树的最多字数
请简单介绍下B+树
B+树是基于B树的
所有的数据都会存储叶子
叶子会形成一个单向链表
非叶子只是用来索引
请简单介绍下索引
创建索引可以提高查询效率,避免进行全表扫描
Mysql使用的引擎是Innodb,使用的是B+树来创建索引
优点: 提高效率
缺点:降低了DML语句的效率
索引占用空间
Mysql的索引类型
mysql有5中索引类型
主键索引
唯一索引
普通索引
组合索引
全文索引
在mysql中也可以将所有分为两大类(1)聚簇索引,就是将索引和行数据存储到一起,在叶子节点中存储了行数据,里面有主键索引(2)二级索引,就是将索引和主键数据存储到一起,在叶节点中存储所有和主键
通过上面我们就可以引出来覆盖索引,就是避免回表,在查询数据的时候如果使用的是二级索引,查询的字段在二级索引中没有,就会在根据主键索引进行查找数据,就会回表,我们可以创建组合索引,就可以避免回表,创建的这个组合索引也就是覆盖索引
什么是最左前缀法则?
在组合索引中,要想命中这个组合索引,就必须在查询条件中使用组合索引中最左边的字段来查询
索引的失效场景?
(1)在搜索条件的字段中使用计算,比如where age/10 = 3;就会导致索引失效
(2)使用了like语句,在前面加%也会导致索引失效
(3)在使用or的时候,左右两边要都使用索引,如果左边有索引,右边没有索引,索引就会失效
(4)在条件中,如果查询的字段是字符串类型,没有加引号,也会导致索引失效
什么是前缀索引?
字段类型为text类型的时候,如果要创建索引,可以取前面一部分来创建索引,大大降低索引的大小
create index 索引名字 on 表(字段(前几个字符))
那些表和字段适合创建索引?
(1)大表适合创建索引,数据量大的表
(2)提高查询的效率,降低增删改的效率,所以对要经常增删改的表尽量不加索引,经常作为查询条件,排序,分组的字段建立索引
(3)对于区分度高的字段,建议创建唯一索引
(4)对于大文本的字段,建议创建前缀索引
(5)尽量使用联合索引,减少单列索引,联合索引很多就可以覆盖索引,可以避免回表
(6)组合索引要符合最左前缀法则
sql优化
(1)查询优化,加索引,将那些表和字段适合创建什么索引将一将,参考上一个答案
(2)主键优化,使用相对有序的id作为主键,推荐使用雪花算法
(3)插入优化,手动开启事务