1.CHAR和VARCHAR有什么区别
CHAR是定长的,而VARCHAR是可以变长的
CHAR尾部的空格会被删除,而VARCHAR不会
CHAR存储的就是字符串去除尾空格后的原始内容,而VARCHAR会在开头使用1-2个字节标识存储 的字符串的长度,在字符串结尾使用一个字节表示字符串结束。
CHAR英文字符占有一个字节,汉字占两个字节,而VARCHAR对每个字符都使用两个字节
(1)float和double的区别是什么
float 最多可以存储 8 位的十进制数,并在内存中占 4 字节。
double 最可可以存储 16 位的十进制数,并在内存中占 8 字节。
2.什么是数据库设计的三大范式
第一范式(1NF):字段(或属性)是不可分割的最小单元,即不会有重复的列,体现原子性
第二范式(2NF):满足 1NF 前提下,存在一个候选码,非主属性全部依赖该候选码,即存在主 键,体现唯一性,专业术语则是消除部分函数依赖
第三范式(3NF):满足 2NF 前提下,非主属性必须互不依赖,消除传递依赖 除了三大范式外, 还有BC范式和第四范式,但其规范过于严苛,在生产中往往使用不到。
3.说一下索引的分类
1. 从物理结构上分
聚簇索引:指索引的键值的逻辑顺序与表中相应行的物理顺序一致,即每张表只能有一个聚 簇索引。
非聚簇索引:指索引的键值的逻辑顺序与数据行的物理顺序不一致。
2. 从应用上划分
普通索引:mysql中的基本索引类型,没有什么限制,允许在定义索引的列中插入重复值和 控制,纯粹是为了提高查询效率。
唯一索引:索引列中的值必须是唯一的,但是允许为空值。
主键索引:特殊的唯一索引,也称为聚簇索引,不允许有空值,并由数据库帮我们自动创 建。 4. 组合索引:组合表中多个字段创建的索引,遵守最左前缀匹配规则
全文索引:只有在 MyISAM 引擎上才能使用,同时只支持 CHAR、VARCHAR、TEXT 类型字 段上 使用
(1)说一下什么是索引
索引是对数据库表中一列或者多列的值进行排序的存储结构,用于快速访问数据库表中的特定信息。他 的作用相当于图书的目录,可以根据这个目录快速找到所需要的内容。索引是针对表而建立的,以便加 速检索物理数据。
(2)索引的数据结构
Mysql中常用的是Hash和B+树 Hash索引底层就是hash表,进行查询的时候调用hash函数获取到相应的键值,然后回表查询获得实际 数据 B+树索引底层实现的原理是多路平衡查找树,对于每一次的查询都是从根节点触发,查询到叶子节点放 可以获得所查键值,最后查询判断是否需要回表查询。
(3)索引失效的几种情况
like 以%开头就会失效,但是后缀有%不会失效
or语句前后没有同时使用索引
联合索引不使用第一列会失效
数据类型出现隐式转化,比如varchar不加单引号可能会自动转换为int型
在索引列上使用了is null或者is not null操作,最好给列设置默认值
在索引字段上使用了not、<>、!=会导致索引失效
对索引字段进行计算操作,字段上使用函数会导致索引失效
当mysql觉得全表扫描更快时(数据少)
3.索引的优缺点
大大加快了数据的检索速度,可以保证数据库表中每一行数据的唯一性
通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性
可以加速表与表之间的连接,特别是在实现数据的参考完整性方面特别有意义
在使用分组和排序子句进行数据检索时,同样可以显著减少查询中分组和排序的时间
通过索引,可以在查询的过程中使用优化隐藏起,提高系统性能
创建和维护索引耗费时间,数据量越大,数据的维护速度越低
索引会占用物理空间,这样除了数据库表占用数据空间外,索引还要占据一定的空间,所占用的资 源就比较多。
4.索引的数据结构?
索引的数据结构和具体存储引擎的实现有关,MySQL 中常用的是 Hash 和 B+ 树索引。 Hash 索引底层就是 Hash 表,进行查询时调用 Hash 函数获取到相应的键值(对应地址),然后 回表查询获得实际数据. B+ 树索引底层实现原理是多路平衡查找树,对于每一次的查询都是从根节点出发,查询到叶子节 点方可以获得所查键值,最后查询判断是否需要回表查询.
5.Hash 和 B+ 树索引的区别?
Hash
1)Hash 进行等值查询更快,但无法进行范围查询。因为经过 Hash 函数建立索引之后,索引的 顺序与 原顺序无法保持一致,故不能支持范围查询。同理,也不支持使用索引进行排序。
2)Hash 不支持模糊查询以及多列索引的最左前缀匹配,因为 Hash 函数的值不可预测,如 AA 和 AB 的 算出的值没有相关性。
3)Hash 任何时候都避免不了回表查询数据.
4)虽然在等值上查询效率高,但性能不稳定,因为当某个键值存在大量重复时,产生 Hash 碰 撞,此 时查询效率反而可能降低。
B+ Tree
1)B+ 树本质是一棵查找树,自然支持范围查询和排序。
2)在符合某些条件(聚簇索引、覆盖索引等)时候可以只通过索引完成查询,不需要回表。
3)查询效率比较稳定,因为每次查询都是从根节点到叶子节点,且为树的高度。
6.如何获取当前数据库版本
使用 select version() 获取当前 MySQL 数据库版本。
(1)怎么验证mysql的索引是否满足需求
使用 explain 查看 SQL 是如何执行查询语句的,从而分析你的索引是否满足需求。
explain 语法:explain select * from table where type=1。
7.说一下ACID是什么
A:原子性,一个事务中的所有操作,要么全部完成,要么全部失败,事务是最小操作单元,不可分 割。
C:一致性:在事务开始之前和结束之后,数据库的完整性没有被破坏。
I:隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,可以防止多个事务并发执 行时由于交叉执行而造成数据不一致的情况。事务隔离分不同级别:读未提交、读提交、可重复读、串 行化。
D:持久性:事务处理结束后,对数据的修改就是永久的。
8.mysql的内连接、左连接、右连接有什么区别
inner join:内连接,把匹配关联的表的数据全部显示出来
left join:左连接,以左表为主显示全部的数据,右表显示符合条件的数据
right join:右连接,以右表为主显示全部的数据,左表显示符合条件的数据
9.说一下数据库的事务隔离
事务的隔离性
脏读:指在一个事务处理过程中读到了另一个未提交的事务中的数据。
不可重复读:指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据,这是 由于在查询间隔,被另外一个事务修改并提交了。
幻读:一个事务在前后两次查询同一个范围时,后一次查询看到了前一次查询没有看到的数据。
事务的隔离级别
Read uncommitted (读未提交):最低级别,以上问题均无法解决。
Read committed (读已提交):读已提交,可避免脏读情况发生。
Repeatable Read(可重复读):确保事务可以多次从一个字段中读取相同的值,在此事务持续 期间,禁止其他事务对此字段的更新,可以避免脏读和不可重复读,仍会出现幻读问题。 Serializable (串行化):最严格的事务隔离级别,要求所有事务被串行执行,不能并发执行,可 避免脏读、不可重复读、幻读情况的发生。
10.说一下mysql常用的引擎
-
InnoDB:提供了对数据库ACID事务的支持,提供了行级锁和外键的约束。他会在内存中建立缓冲 池,用于缓冲数据和索引。启动比较慢,不会保存表的行数,所以在查询行数的时候他需要扫描全 表得出行数。
-
MyISAM:mysql的默认引擎,不支持事务、行级锁和外键,支持表锁。因此插入和更新操作,需 要锁定这个表,效率会低一点。不过它保存了表的行数,所以在查询行数时不需要扫描全表。 3. 查询操作多且不需要事务支持的优先用MyISAM,写操作多的且需要事务支持的有限用InnoDB。
(1)说以下mysql的行锁和表锁
InnoDB支持表锁和行锁,且默认为行锁;而MyISAM只支持表锁。 表锁:开销小,加锁快,不会出现死锁。锁的粒度大,发生锁冲突的概率最高,并发量最低。 行锁:开销大,加锁慢,会出现死锁。锁的粒度小,发生锁冲突的概率小,并发度最高。
(2)说一下乐观锁和悲观锁
乐观锁:每次去拿数据的时候都认为别人不会修改,所以不会上锁,但在提交更新的时候会判断以下在 此期间别人有没有去更新这个数据。 悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿数 据就会阻止,直到这个锁被释放。
11.如何做mysql的性能优化
为搜索字段创建索引
避免使用 select *查询,使用具体字段查询
垂直分割分表
选择正确的存储引擎