1.数据库的三范式是什么?
第一范式:强调的是列的原子性,即数据表的每一列都是不可分割的原子数据项
第二范式:要求实体的属性完全依赖于主关键字
第三范式:任何非主属性不依赖于其它非主属性
2.MyISAM和InnoDB引擎的区别
MyISAM 只有表级锁,而InnoDB 支持行级锁和表级锁,默认为行级锁;
MyISAM 不提供ACID事务支持。而InnoDB提供事务支持;
MyISAM不支持外键,而InnoDB支持;
MyISAM不支持聚集索引,InnoDB支持聚集索引;
MyISAM保存了表的行数,执行select count(*) 的时候,可以直接读取保存的结果,而InnoDB不会保存表的行数,执行 select count(*) from table 指令时,需要进行扫描全表;
MyISAM不支持MVCC,InnoDB支持。应对高并发事务,MVCC比单纯的加锁更高效;
3.一张自增表里面总共有 7 条数据,删除了最后 2 条数据,重启 mysql 数据库,又插入了一条数据,此时 id 是几?
表类型如果是MyISAM,那ID就是8
表类型如果是InnoDB,那ID就是6
InnoDB采用聚簇索引来存储数据,MyISAM采用非聚簇索引。
InnoDB的索引和数据是关联在一起的,在B+树的根节点,而MyISAM的key-value存的是key和地址指针,其真正的文件存在于其他位置。
4.如何获取当前数据库版本?
select version()
5.说一下ACID是什么?
Atomicity(原子性):一个事务(transaction)中的所有操作,或者全部完成,或者全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被恢复(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。即,事务不可分割、不可约简。
Consisitency(一致性):在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设约束、触发器、级联回滚等。
Lsolation(隔离性):数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行由于交叉执行而导致数据的不一致。
Durability持久性:事务结束后,对数据的修改就是永久的,即使系统故障也不会丢失。
6.说一下数据库的事务隔离
数据库的事务隔离是在MySQL.ini配置文件里添加的,在文件最后添加:transaction-isolation=
可用配置:读未提交(READ-UNCOMMITTED)、读提交(READ-COMMITED)、可重复读(
REPEATABLE-READ)和串行化(SERIALZABLE)
READ-UNCOMMITTED:未提交读,最低隔离级别、事务未提交前,就可被其他事务读取(会出现幻读、脏读、不可重复读)。
READ-COMMITTED:提交读,一个事务提交后才能被其他事务读取到(会造成幻读、不可重复读)。
REPEATABLE-READ:可重复读,默认级别,保证多次读取同一个数据时,其值都和事务开始时候的内容是一致,禁止读取到别的事务未提交的数据(会造成幻读)。
SERIALIZABLE:序列化,代价最高最可靠的隔离级别,该隔离级别能防止脏读、不可重复读、幻读。
脏读:表示一个事务能够读取到另一个事务还未提交的数据。
不可重复读:是指在一个事务内,多次读同一数据。
幻读:指同一事务内多次查询返回的结果集不一样。发生幻读的原因也是另外一个事务新增或者删除或者修改了第一个事务结果集里面的数据,同一个记录的数据内容被修改了,所有数据行的记录就变多或者变少了。
7.cahr和varchar的区别是什么?
char:固定长度类型。优点:效率高;缺点:占用空间。
varchar:可变长度。存储的值是每个值占用的字节再加上一个用来记录其长度的字节的长度。
所以,从空间上考虑varchar比较合适;从效率上考虑char比较合适。
8.float和double的区别是什么?
float最多可以存储8位的十进制数,并在内存中占4字节。
double最多可以存储16位的十进制数,并在内存中占8字节。
9.mysql的内连接、左连接、右连接的区别?
内连接是把匹配的关联数据显示出来;
左连接是把左边的表全部显示出来,右边的表显示出符合条件的数据,如果没有就显示为NULL;
右连接返回来同理。
10.mysql索引是怎么实现?
索引是满足某种特定查找算法是数据结构,而这些数据结构会以某种方式指向数据,从而实现高效查找数据。
目前主流的数据库引擎的索引都是B+树实现的,B+树的搜索效率,可以达到二分法的性能,找到数据区域之后就找到了完整的数据结构了,所有索引的性能也是更好的。
11.怎么验证mysql的索引是否满足需求?
explain select * from table where column=' '
使用explain查看SQL是如何执行查询语句,从而分析你的索引是否满足需求
12.说一下mysql的行锁和表锁
MyISAM只支持表锁,InnoDB支持表锁和行锁,默认为行锁。
表级锁:开销小,加锁快,不会出现死锁。锁力度大,发生锁冲突的概率高,并发量低。
行级锁:开销大,加锁慢,会出现死锁。锁力度小,发生锁冲突的概率小,并发度高。
13.说一下乐观锁和悲观锁
乐观锁:每次去拿数据时都认为别人不会修改,所以不会上锁,但是在提交更新的时候会判断一下在此期间别人有没有去更新这个数据。
悲观锁:每次去拿数据的时候都认为别人会修改,所以每次在拿数据的时候都会上锁,这样别人想拿这个数据都会阻止,直到这个锁被释放。
14.mysql问题排查的手段有哪些?
使用show processlist 命令查看当前所有连接信息。
使用explain命令查询SQL语句执行计划。
开启慢查询日志,查看慢查询的SQL。
15.如何做mysql的性能优化?
合理使用索引,提高搜索效率。
优化SQL查询语句。
适当调整服务器配置,硬件和软件配置都对MySQL性能产生影响。
定期维护数据库。
合理分配资源和连接管理。
使用缓存技术。
数据分区和分表。
应用负载均衡技术。
优化数据库设计。
监控性能和调优。
16.什么是数据分区?
根据一定的逻辑,将一个表拆分成多个更小更容易管理的部分。
其主要目的是为了在特定的SQL操作中减少数据读写的总量以缩减响应时间。
查看是否支持分区命令:
5.6以下的版本:show variables like '%partition%';
5.6以上的版本:show plugins;当看到有partition并且status是active时表示支持。
17.为什么要分区?
分区可以在一个表中存储比单个磁盘或文件系统分区上的数据更多的数据,因此我们可以将分区表存储在不同物理磁盘上。
对已过期或者不需要保存的数据,可以通过删除与这些数据有关的分区来快速删除数据,他的效率远比delete高。
优化查询,在where子句中包含分区条件时,可以只扫描必要的一个或多个分区来提高查询效率。
凭借在多个磁盘上传播数据,实现更高的查询吞吐量。
18.怎样分区?
RANGE分区:基于一个给定连续区间范围,把数据分配到不同的分区;
LIST分区:类似RANGE分区,区别在LIST分区是基于枚举出的值列表分区,RANGE是基于给定连续区间范围分区;
HASH分区:基于用户定义的表达式返回值来选择分区,该表达式对要插入到表的行中列值操作;
KEY分区:类似HASH,但是HASH允许使用用户自定义表达式,而KEY分区不允许,它需要使用MySQL服务器提供的HASH函数,同时HASH分区只支持整数分区,而KEY分区支持除BLOB和TEXT类型外其他列。
19.如何SQL优化?
(1)使用索引:为经常用于过滤、排序或连接操作的列创建合适的索引。考虑使用覆盖索引,将所需的列包含在索引中,以避免回表操作。
(2)编写有效的WHERE子句:尽量避免在WHERE子句中对查询的列执行范围查询和使用函数或表达式操作,它们可能导致索引失效,从而导致全表扫描。避免在WHERE子句中对列进行隐式类型转换,这会降低查询性能。
(3)避免全表查询:尽可能使用索引来限制返回结果的行数。对于大表,注意避免全表扫描的查询方式,如分页查询、使用LIMIT限制结果集大小。
(4)优化GROUP BY和ORDER BY:减少GROUP BY和ORDER BY子句中列的数量,如果需要对多个列进行GROUP BY或ORDER BY,可以考虑创建组合索引以支持这些操作。
(5)优化JION操作:确保所有参与JION的列都有相应的索引。根据表之间关联的具体情况选择合适的JION类型。在可能的情况下,使用子查询或临时表来替代复杂的JION操作。如果数据量较大,先分页再JION可以避免大量逻辑读,从而提高性能。
(6)使用explain命令分析查询计划:EXPLAIN关键字分析SQL语句的执行计划,并查看涉及的索引、表访问方式等信息,以发现潜在的性能问题。
(7)尽量明确只查询所需列,避免使用select *,SELECT *会导致全表扫描,降低性能。