数据库

charvarchar的区别

char设置多少长度就是多少长度,varchar可以改变长度,所以char的空间利用率不如varchar的空间利用率高。

②因为长度固定,所以存取速度要比varchar快。

char适用于固定长度的字符串,比如身份证号、手机号等,varchar适用于不固定的字符串。

 

数据库的三大范式

第一范式(1NF): 保证字段不可再分,保证原子性。

第二范式(2NF): 满足1NF前提下,表的每一列都必须和主键有关系。消除部分依赖关系。

第三范式(3NF): 满足2NF前提下,表的每一列比必须和主键有直接关系,不能是间接关系。消除传递依赖

索引的类型

①普通索引: 基本索引类型,允许定义索引的字段为空值和重复值。

②唯一索引: 索引的值必须唯一,允许定义索引的字段为空值。

③主键索引: 索引的值必须唯一,不可以为空。

④复合索引: 多个字段加索引,遵守最左匹配规则。

⑤全局索引: 只有在 MyISAM 引擎上才能使用。

 

索引怎么设计(优化)

①选择唯一性索引:值是唯一的,查询的更快。

②经常作为查询条件的字段加索引。

③为经常需要排序、分组和联合操作的字段建立索引:order bygroup byunion(联合)distinct(去重)等。

④限制索引个数:索引数量多,需要的磁盘空间就越多,更新表时,对索引的重构和更新就很费劲。

⑤表数据少的不建议使用索引(百万级以内):数据过少,有可能查询的速度,比遍历索引的速度都快。

⑥删除不常用和不再使用的索引。

⑦用类型小的类型做索引:比如:intBIGINT能用int就使用int。因为类型小,查询速度快和索引占用的空间更少。

⑧使用前缀索引,要是字符串越长,那么索引占的空间越大,并且比较起来就时间就越长。

 

二叉查找树、B树、B+

二叉查找树(二叉排序树、二叉搜索树): 一个节点最多两个子节点(左小右大),查询次数和比较次数都是最小的,但是索引是存在磁盘的,当数据量过大的时候,不能直接把整个索引文件加载到内存,需要分多次IO,最坏的情况IO的次数就是树的高度,为了减少IO,需要把树从竖向变成横向。

B( B- ): 是一种多路查询树,每个节点包含K个子节点,节点都存储索引值和数据,KB树的阶(树高被称为树的阶)。虽然比较的次数比较多,但是是在内存的比较,可以忽略不计,但是BIO的次数要比二叉查找树要少,因为B树的高度可以更低。

B+树: B树的升级版,只有叶子节点储存的是索引值指向的数据库的数据。

 

为什么使用B+树不用B

B树只适合随机检索,而B+树同时支持随机检索和顺序检索(因为叶子节点相当于链表,保存索引值都是有序的)

顺序检索: 按照序列顺序遍历比较找到给定值。

随机检索: 不断从序列中随机抽取数据进行比较,最终找到结果。

②减少了磁盘IO,提高空间利用率: 因为B+树非叶子节点不会存放数据,只有索引值,所以非叶子节点可以保存更多的索引值,这样B+树就可以更矮,减少IO次数。

B+树适合范围查找: 这才是关键,因为数据库大部分都是范围查找,B+树的叶子节点是有序链表,直接遍历就行,而B树的范围查找可能两个节点距离很远,只能通过中序遍历去查找,所以使用B+树更合适。

中序遍历: (根在中,从左往右,一棵树的左子树永远在根前面,根永远在右子树前面)

 

脏读、不可重复读、幻读

脏读: 也叫"读未提交",顾名思义,就是某一事务A读取到了事务B未提交的数据。

不可重复读: 在一个事务内,多次读取同一个数据,却返回了不同的结果。实际上,这是因为在该事务间隔读取数据的期间,有其他事务对这段数据进行了修改,并且已经提交,就会发生不可重复读事故。

幻读: 在同一个事务中,第一次读取到结果集和第二次读取到的结果集不同。像幻觉一样所以叫幻读。

从上面可以看出脏读和不可重复读是基于数据值的错误,幻读是基于条数增加或者减少的错误

 

优化数据库:SQL优化 加缓存 分表 读写分离

 

SQL优化

①不要用select *,要使用具体字段。

②使用数值代替字符串,比如:0=唱,1=跳,2=rap

③避免返回大量数据,采用分页最好。

④使用索引,提升查询速度,不宜建太多索引,不能建在重复数据比较多的字段上。

⑤批量插入比单条插入要快,因为事务只需要开启一次,数据量太小体现不了。

⑥避免子查询,优化为多表连接查询。

⑦尽量使用union all替代union,因为union会自动去重。

 

inexists的区别

in(): 适合子表(子查询)比主表数据小的情况。

exists(): 适合子表(子查询)比主表数据大的情况。

 

droptruncatedelete的区别

速度: drop > truncate > delete

回滚: delete支持,truncatedrop不支持。

删除内容: delete表结构还在,删除部分或全部数据,不释放空间。truncate表结构还在,删除全部数据,释放空间。drop表结构和数据不在,包括索引和权限,释放空间。

 

数据库索引失效的情况记录:

1.查询条件中有or,即使有部分条件带索引也会失效

2.like查询是以%开头

3.如果列类型是字符串,那在查询条件中需要将数据用引号引用起来,否则不走索引

4.索引列上参与计算会导致索引失效

5.违背最左匹配原则

6.如果mysql估计全表扫描要比使用索引要快,会不适用索引

posted @   wrf12  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
点击右上角即可分享
微信分享提示