浮点数和定点数
在处理小数的时候,如果对精度要求比较高,那么使用定点数decimal,相对于浮点数将十进制转为二进制进行存储,定点数是将十进制的整数部分和小数部分拆开,分别转成十六进制存储。
在一些对精度要求不高的场景,可以采用浮点数类型,float和double,比起占有同样字节长度的定点数,浮点数表达的数值范围更大一些。
文本类型
- char(M):固定长度字符串,由于必须预先定义字符串长度,如果太短数据可能会超出范围,如果太长,造成资源浪费,比较适合存储定长字符串,比如定长账号等;
- varchar(M):可变长度字符串,只需要预先知道字符串的最大长度,只要不超过这个最大长度即可,实际存储的时候是按照实际字符串长度存储的;
- text:字符串,系统自动按照实际长度存储,不需要预先定义长度;但是由于存储长度不定,mysql不允许text类型字段做主键。
- enum:枚举类型,数据必须是预先设定的一组字符串范围之内的一个,必须预先知道所有可能的取值;
- set:字符串对象,取值必须是在预先设定的字符串范围之内的0个或者多个,也必须知道字符串所有可能的取值;
从速度角度上看:
- char定长,最多存储255个字符,基本没有碎片,索引速度极快;会去掉结尾的空格
- varchar不定长,索引没有char快;不会去掉结尾的空格
- text不定长,速度慢,索引只能是前缀索引;不会去掉结尾的空格;不能设置默认值;
sql语句查询顺序
- from
- join等
- where
- group by
- having
- select
- distinct
- top
- order by
10.limit
where 和having 的区别
- 如果需要通过链接从关联表中获取需要的数据,where是先筛选后链接, having是先链接后筛选;这也就决定了关联查询where比较高效;
- where可以直接用表中字段进行筛选,having必须和group by配合使用,可以把分组计算函数和分组字段作为筛选条件;
数据库索引
主键索引和二级索引会各对应b+树;
主键索引的b+树是聚簇的,即所有数据都在叶子结点,但是非聚簇索引的叶子结点只包括主键,然后去主键b+树去查找具体行,这叫做回表,优化思路就是不进行回表。
可以利用覆盖索引。
覆盖索引和组合索引:
如果采用组合索引,而不需要回表的情况,就是覆盖索引。
(覆盖索引就是将需要查的字段和查询字段一起创建组合索引,那么就不需要回表了,所以日常业务查询的时候,避免查询多余不需要的字段)
聚簇:索引和数据是否在一起存储。
这里myisam采用的是非聚簇索引,叶子结点存储的是刺破文件地址;
innodb的主键索引是聚簇索引,辅助索引是非聚簇索引。
b+树:
- 平衡树;
- 数据存储在叶子结点,查询较为稳定;
- 叶子结点之间用引用相连,范围查找比较快
查看索引[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只有前后条件语句都有索引才会用到索引
- 子查询的效率比较低,因为会涉及到创建临时表,所以这里建议换成链接查询