1.Mysql中char和varchar有什么区别?
(1)char是一种固定长度的类型,varchar是一种可变长度的类型。
(2)char会造成空间浪费,但是具有速度优势,而varchar节省了空间,但是速度不如char。
2.Mysql中float和double的区别是什么?
(1)float占用四个字节,double占用八个字节
(2)float小数点有效位数7位,双精度小数点后有效位数16位
(3)在程序中处理速度不同,一般来说,CPU处理单精度浮点数的速度比处理双精度浮点数快
3.Mysql中date和datetime类型的区别?
(1)date类型可用于需要一个日期而不需要时间的部分
格式为'YYYY-MM-DD' 范围是'1000-01-01' 到'9999-12-31'
(2)datetime类型可用于需要同时包含日期和时间的信息的值
格式为YYYY-MM-DD HH:mm:ss 范围是'1000-01-0100:00:00' 到 '9999-12-3123:59:59'
4.Mysql中sql语句执⾏的顺序?(查询语句)
顺序:
from,on,join,where,group by,having+聚合函数,select,order by,limit
5.说一下MySQL常用的存储引擎?
存储引擎是决定了表中数据如何存储,查询,更新及索引如何存储,在创建表的时候可以指定存储引擎
(1)InnoDB存储引擎
InnoDB是事务型数据库的首选引擎,支持事务的ACID,支持行锁定和外键,InnoDB是默认的MySQL引擎。mysql8.0每个innoDB的表对应一个.*idb和.*frm,frm存储的是表结构,idb存储的是数据和索引
(2)MyISAM
MyISAM基于ISAM存储引擎,没有事务,没有行表,没有外键,但是有表锁。每个MyISAM的表对应三个文件*.myi(索引),*.myd(数据),*.sdi(表结构),MongoDB代替MyISAM
(3)MEMORY
MEMORY存储引擎将表中的数据存储到内存中,重启mysql表数据会丢失。每一个表实际上和一个磁盘文件关联,文件是*.frm。redis代替MEMORY
6.说一下MySQL数据库事务的三个安全性问题?
(1)脏读:指得是一个事务读到另一个事务未提交的数据。(读到的未提交的数据)
(2)不可重复读:指的是一个事务读到了另一个事务已经提交的update的数据,导致多次查询结果不一致,导致在一个事务中两次读取数据不一致。(再次读到的数据不一致)
(3)幻读:指的是一个事务读到了另一个事务已经提交的insert的数据,导致多次查询结果不一致。(读到的行数不一样)
7.说一下MySQL数据库事务的隔离级别?
(1)read uncommitted,脏读,不可重复读,幻读都可能发生
(2)read committed,避免脏读,但是不可重复读和幻读还是可能发生(Oracle默认隔离级别)
(3)repeatable read,避免藏独,不可重复度,但是幻读可能发生(MySQL默认隔离级别)
(4)serializable: 串行化的,避免脏读, 不可重复读, 虚读
安全性:read uncommitted < read committed < repeatable read< Serializable
效率:read uncommitted > read committed > repeatable read > Serializable
8.谈谈对Mysql存储过程的认识?
经过事先编译存储在数据库的一段SQL语句的集合,类似于java中的方法。一般可以把一些比较耗时的操作编写到存储过程中,然后使用java程序调用,减少数据在数据库和应用服务器之间的传输,从而提高了数据处理效率。
9.说一说你对触发器的理解?
触发器是一种与表绑定的一种数据库对象
作用是监听表中记录变化(insert update delete),当表中数据产生增删改的操作触发器就会执行
10.Inner join、left join和right join 的区别?(高频)
(1)Inner join 内连接,只展示两个表有关联关系的数据,没有关联则不展示
(2)left join 左外连接,左表的数据完全展示,而右表只展示与左表有关联关系的数据
(3)right join 右外连接,右表的数据完全展示,而左边只展示与右边有关联关系的数据
左外和右外是相对的
11.a、b两表字段相同,写一条sql将a表数据拷贝到b表中?
INSERT INTO 目标表(b) SELECT * FROM 来源表(a);
12.Mysql数据库的三大范式是什么?
(1)第一范式,数据表中的列要具备原子性,不可再拆分
(2)第二范式,任何一个非主键字段都依赖于主键字段,每个表只描述一件事情
(3)第三范式,任何2个非关键字段数值之间不存在函数依赖
13.Mysql中如何获取当前数据库版本?
登录到mysql中以后,进入mysql的bin目录
(1)select VERSION()
(2)mysql --version|-V
14.Mysql如何实现分页?
limit start ,size
start 是从哪个索引开始,size是每页展示条数
start=(页码-1) * size
15.什么是MySQL索引?
索引是提高查询效率的一种数据结构;
比如如果没有索引要找一个年龄=25的人,就需要进行全盘扫描查找,时间复杂度是O(n)
但是把年龄使用二叉查找树存入,那么时间复杂度只需要O(logN),但是MySQL底层用的不是二叉查找树,是B+树(B+树每个节点存的数据更多,每个节点的子树更多,这样保证海量数据树也不会很深)
索引的分类:
(1)普通索引 index:对索引字段没有要求。
(2)唯一索引 unique index:要求索引字段值不能重复。同时增加唯一约束。
(3)主键索引 primary key:要求索引字段值不能重复,也不能为NULL。同时增加主键约束
(4)全文索引 fulltext key:索引字段的来源不是所有字段的数据,而是从字段中提取的特别关键词。
(5)复合索引
创建索引:create (索引类型)index 索引名称 on 表(字段....)
eg:create index idx_name_money tb_account(name,money)
16.什么是B+树?
(1)平衡二叉搜索树
两个实现:1.AVL树,左右子树高度差不超过2
2.RedBlank树:使用红黑规则保持平衡
红黑规则:1.节点只有红色和黑色的
2.根节点必须是黑色的
3.红节点不能相连
4.从任意节点到叶子节点,黑色节点是数量是相同的
5.叶子节点都是黑色的
(2)多路平衡搜索树
- B树是多路平衡搜索树
1.一个节点可以存储多个数据
2.一个节点有多个子树
3.树中最多的子树我们就称为B树的介(eg:三阶子树就代表这个树最多有三个子树)
4.子树的范围 [阶/2] ~ 阶 (eg:三阶子树子树个数的范围(3/2)~ 3,也就是2 ~ 3)
5.数据范围[阶/2] - 1 ~ 阶-1 (eg:三阶子树的每个节点存储范围在,(3/2)-1 ~ 3-1,也就是每个结点可以存储1 ~ 2数据)
6.根节点的子树个数范围特殊, 根节点可以有2~m个子树(eg:三阶子树的根节点可以有2~3个子树),根节点可以存储1~m-1个数据(eg:三界子树的根节点可以存储有1~2个数据)
-B+树是有约200颗子树
17.MySQL索引的优势和劣势?
(1)优势: 可以提高数据检索的效率,降低数据库的IO成本,类似于书的目录。 通过索引列对数据进行行排序,降低数据排序的成本,降低了了CPU的消耗
(2)劣势:索引会占据磁盘空间 索引虽然会提高查询效率,但是会降低更新表的效率。比如每次对表进行增删改操作,MySQL不仅要保存数据,还要保存或者更新对应的索引文件
18.索引是怎么存储的?
索引是在存储引擎中实现的,也就是说不同的存储引擎,会使用不同的索引
19.什么是聚簇索引,什么是回表?
MySQL的索引可以分为聚簇索引(主键索引)和非聚簇索引(非主键索引)
聚簇索引是不仅存储主键数据还存储记录,记录就是指数据库中的一行数据
非聚簇索引只存数据和主键
将来根据非聚簇索引查询需要进行回表。
MySQL根据索引查询,索引中存储的数据满足就无需回表,如果索引中的数据不够就需要回表。
查询流程:
eg:select * from where money = 2000;
money建立了非聚簇索引,这条语句通过money索引查询到money=2000和主键,通过主键去聚簇索引查询到记录然后返回(这个过程叫回表)。
20.什么情况下索引会失效?
复合索引的最左前缀法则:
create index idx_name_money tb_account(name,money)
查询条件必须包含索引最左边的字段,也就是name,才会使用到索引,否则失效,
可以使用explain关键字可以查看是否命中索引。
(1)索引列上进行运算
(2)字符串类型不加‘’
(3)模糊查询前面加%,比如like‘%马’
(4)如果使用or进行查询,两边条件都有索引不会失效,左边有索引右边没有索引会失效
(5)如果走索引比全盘扫描还慢就不会走索引
21.哪些表及字段适合创建索引?
(1)大表(数据量比较大)
(2)创建索引会提高查询效率,会降低增删改效率,因为增删改会改变表,索引结构也会跟着变化。(读操作比较多)
(3)针对常作为查询条件(where),排序(order by),分组(group by)操作的字段建立索引
(4)尽量选择不会重复的列作为索引,尽量建立唯一索引,区分度越高,使用索引的效率越高
(5)尽量使用联合索引,减少单列索引,查询时,联合索引很多时候可以覆盖索引,节省存储空间,提高查询效率
(6)要控制索引的数量,索引并不是多多益善,索引越多,维护索引结构的代价也越大,会影响增删改的效率
(7)如果存储是字符串类型(text)的字段,字段的长度较长,可以根据字段的特点,创建前缀索引。取字符串的一小部分前缀作为索引,大大降低索引的大小。根据前缀索引查询出来的结果还会在来一次精确匹配,因为前缀的信息并不全,前缀只保存数据的一部分。
22.SQL优化?
查询优化 ---> 加索引,避免索引失效。
23.说一说你们公司数据库都是如何优化的?
(1)尽量避免使用select *
(2)为经常用来查询的字段添加索引
(3)多使用limit
(4)分库分表
(5)读写分离
7万+

被折叠的 条评论
为什么被折叠?



