MySQL

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)读写分离

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值