1.char和varchar区别
①char长度不可变,varchar长度可变,所以char空间利用率不高
②但char长度固定,读取速度块
③char常用于电话号,身份证号等
2.三大范式
第一范式(1NF):保证字段不可再分,保证原子性
第二范式(2NF):满足1NF前提下,表的每一列都必须和主键有关系,消除部分依赖
部分依赖:eg:一个表主键由A和B组成,而C只依赖B
第三范式(3NF):满足2NF前提下,表的每一列和主键必须有直接关系,不能是间接关系,消除传递依赖
3.SQL语句执行顺序
from -> on(连接条件) -> (left | right | inner)join -> where -> group by -> having -> select -> distinct -> order by -> Limit
4.索引
是一种高效获取数据的数据结构,相当于目录,可以更快的找到数据,是一个文件,要占物理空间
①普通索引: 基本索引类型,允许定义索引的字段为空值和重复值。
②唯一索引: 索引的值必须唯一,允许定义索引的字段为空值。
③主键索引: 索引的值必须唯一,不可以为空。
④复合索引: 多个字段加索引,遵守最左匹配规则。
⑤全局索引: 只有在 MyISAM 引擎上才能使用。
优点:提高检索速度,索引列对数据排序,降低排序成本
缺点:也是文件,需要占据空间。降低更新速度,因为要更新数据和索引
5.索引怎么优化
①选择唯一性索引:值是唯一的,查询的更快。
②经常作为查询条件的字段加索引。
③为经常需要排序、分组和联合操作的字段建立索引:order by、group by、union(联合)、distinct(去重)等。
④限制索引个数:索引数量多,需要的磁盘空间就越多,更新表时,对索引的重构和更新就很费劲。
⑤表数据少的不建议使用索引(百万级以内):数据过少,有可能查询的速度,比遍历索引的速度都快。
⑥删除不常用和不再使用的索引。
⑦用类型小的类型做索引:比如:int和BIGINT能用int就使用int。因为类型小,查询速度快和索引占用的空间更少。
⑧使用前缀索引,要是字符串越长,那么索引占的空间越大,并且比较起来就时间就越长。
6.如何避免索引失效
①避免对索引进行运算
②避免对索引列进行隐式数据类型转换,即确保查询条件的类型与索引列的类型匹配
③在where子句中不要使用 OR、!=、<>和对值null的判断。
④避免使用’%'开头的like的模糊查询。
⑤字符串不加单引号,造成索引失效。
⑥字符串不加单引号,造成索引失效。
索引失效会造成全表扫描
全表扫描共有三种情况可以触发:索引失效,没有索引,小表
7.索引的数据类型
Hash: 查询时调用Hash函数获得地址,回表查询实际数据。(InnoDB和MylSAM不支持,Memory支持)。
B+树: 每次从根节点出发去查询,然后得到地址,回表查询实际数据。
使用树结构的原因:加快查询速率,且可以保持有序
8.最左匹配原则
最左优先,以最左边为起点任何连续的索引都能匹配上。同时遇到范围查询(>、<、between and、like)就会停止匹配。
9.事务
四大特性:
原子性:作为一个整体,要么成功要么失败
隔离性:事务执行前后,原本和数据库一致的数据,依然还一致
一致性:事务与事务之间互不干扰
持久性:事务一旦被提交了,那么对数据库中的数据的改变就是永久的
PS:嵌套事务,多个事务嵌套在一起组成同一个事务,仍遵循四特性。通过保存点SAVEPOINT来进行回滚
10.脏读,不可重复读,幻读
数据库事务处理中常见的三种并发问题,产生与处理都与事务隔离级别相关
- 脏读:脏读也俗称“读未提交”,即事务A读取到了事务B未提交的数据。
- 不可重复读:在一个事务内,多次读取同一个数据,却返回了不同的结果。实际上,这是因为在该事务间隔读取数据的期间,有其他事务对这段数据进行了修改,并且已经提交,就会发生不可重复读事故。
- 幻读:幻读是指当事务不独立执行时,插入或者删除另一个事务当前影响的数据而发生的一种类似幻觉的现象。
11.事务的隔离级别
① read uncommited(读取未提交内容) :在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。读取未提交的数据,也被称之为脏读(Dirty Read)
② read committed(读取提交内容):这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。可解决脏读
③ repeatable read(可重读):这是MySQL的默认事务隔离级别,同一事务的多个实例在并发读取数据时,会看到同样的数据。不过理论上,这会导致另一个棘手的问题:幻读(Phantom Read)。可解决脏读、不可重复读
④ serializable (可串行化 ) :这是最高的隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决幻读问题。简言之,它是在每个读的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。可解决脏读、不可重复读、幻读。
12.怎么优化数据库
①SQL语句优化
②加缓存:
- 在应用层使用缓存(如 Redis、Memcached)来存储热点数据,减少对数据库的直接访问。
- 数据库层面的查询缓存,可以缓存相同的查询结果,减少重复查询带来的性能损耗。
③分表
④读写分离:
-
配置主从复制:
- 在 MySQL 中配置主数据库和从数据库,并设置复制用户和权限。
- 配置主数据库的
binlog
(binary log)用于记录写操作的日志。 - 在从数据库中配置
relay log
,用于读取主数据库的写日志。
-
使用 ProxySQL 实现读写分离:
- 配置 ProxySQL,将写操作路由到主数据库,将读操作路由到从数据库。
- 设置读写分离规则,配置主数据库和从数据库的连接池。
-
修改应用程序代码:
- 在应用程序中实现读写分离逻辑,确保写操作发送到主数据库,读操作发送到从数据库。
13.drop ,truncate , delete
速度: drop > truncate > delete。
回滚: delete支持,truncate和drop不支持。
删除内容: delete表结构还在,删除部分或全部数据,不释放空间。truncate表结构还在,删除全部数据,释放空间。drop表结构和数据不在,包括索引和权限,释放空间。
监控和分析查询计划
- 使用数据库的
EXPLAIN
或EXPLAIN PLAN
命令来查看查询计划,确认索引是否有效地被使用