mysql必知必会

浮点数和定点数

在处理小数的时候,如果对精度要求比较高,那么使用定点数decimal,相对于浮点数将十进制转为二进制进行存储,定点数是将十进制的整数部分和小数部分拆开,分别转成十六进制存储。
在一些对精度要求不高的场景,可以采用浮点数类型,float和double,比起占有同样字节长度的定点数,浮点数表达的数值范围更大一些。

文本类型

  1. char(M):固定长度字符串,由于必须预先定义字符串长度,如果太短数据可能会超出范围,如果太长,造成资源浪费,比较适合存储定长字符串,比如定长账号等;
  2. varchar(M):可变长度字符串,只需要预先知道字符串的最大长度,只要不超过这个最大长度即可,实际存储的时候是按照实际字符串长度存储的;
  3. text:字符串,系统自动按照实际长度存储,不需要预先定义长度;但是由于存储长度不定,mysql不允许text类型字段做主键。
  4. enum:枚举类型,数据必须是预先设定的一组字符串范围之内的一个,必须预先知道所有可能的取值;
  5. set:字符串对象,取值必须是在预先设定的字符串范围之内的0个或者多个,也必须知道字符串所有可能的取值;

从速度角度上看:

  • char定长,最多存储255个字符,基本没有碎片,索引速度极快;会去掉结尾的空格
  • varchar不定长,索引没有char快;不会去掉结尾的空格
  • text不定长,速度慢,索引只能是前缀索引;不会去掉结尾的空格;不能设置默认值;

sql语句查询顺序

  1. from
  2. join等
  3. where
  4. group by
  5. having
  6. select
  7. distinct
  8. top
  9. order by
    10.limit

where 和having 的区别

  1. 如果需要通过链接从关联表中获取需要的数据,where是先筛选后链接, having是先链接后筛选;这也就决定了关联查询where比较高效;
  2. where可以直接用表中字段进行筛选,having必须和group by配合使用,可以把分组计算函数和分组字段作为筛选条件;

数据库索引

主键索引和二级索引会各对应b+树;
主键索引的b+树是聚簇的,即所有数据都在叶子结点,但是非聚簇索引的叶子结点只包括主键,然后去主键b+树去查找具体行,这叫做回表,优化思路就是不进行回表。
可以利用覆盖索引。

覆盖索引和组合索引:
如果采用组合索引,而不需要回表的情况,就是覆盖索引。
(覆盖索引就是将需要查的字段和查询字段一起创建组合索引,那么就不需要回表了,所以日常业务查询的时候,避免查询多余不需要的字段)

聚簇:索引和数据是否在一起存储。
这里myisam采用的是非聚簇索引,叶子结点存储的是刺破文件地址;
innodb的主键索引是聚簇索引,辅助索引是非聚簇索引。

b+树:

  1. 平衡树;
  2. 数据存储在叶子结点,查询较为稳定;
  3. 叶子结点之间用引用相连,范围查找比较快

查看索引[3]:
show index from table
可以查看cardinality:是一个预估值,索引中唯一值数目的估计值,在小型表中没有意义。

参考:
【1】https://www.cnblogs.com/GrimMjx/p/10540263.html
【2】https://www.huaweicloud.com/articles/6856b2ffc571c3d52b0465e1c68acc77.html
【3】 show index from table命令

事务

四大特性:

  • 隔离性:
    不同的隔离级别:读未提交,读已提交,重复读(mysql默认隔离级别),序列化
    主要依靠锁来控制事务对数据的操作。锁的方式不同,隔离程度也不一样
  • 持久性:永久有效的
  • 原子性:整体
  • 一致性:数据的完整性

三大范式

  • 表中所有字段都不可拆分的基础字段
  • 在满足第一范式的基础上,所有的非主键字段,必须完全依赖主键字段,不能存在依赖主键一部分,针对联合主键而言
  • 在满足第二范式的基础上,数据表中不能存在依赖非主键字段的字段。
    但是实际以业务为准
    https://www.huaweicloud.com/articles/c1c4f2d4c72b61eab44114ae8286835f.html

优化

  • 用explain 来分析查询语句
  • 创建索引
  • 关键字“like”只有当%在后面才会用索引
  • 关键字or只有前后条件语句都有索引才会用到索引
  • 子查询的效率比较低,因为会涉及到创建临时表,所以这里建议换成链接查询
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值