数据库在系统中是非常重要的一环,当数据量大的时候,数据库就会有瓶颈,也就是查询变慢,我们需要对数据库进行优化
整数
TinyInt,SmallInt,MediumInt,Int,BigInt 使用的存储 8,16,24,32,64 位存储空间,使用Unsigned 表示不允许负数,可以使正数的上限提高一倍
实数
字符串
时间类型
优化点建议
不建议为null的原因:
You cannot use arithmetic comparison operators such as =, <, or <> to test for NULL.
官方文档:“NULL columns require additional space in the row to record whether their values are NULL. For MyISAM tables, each NULL column takes one bit extra, rounded up to the nearest byte.”
Mysql难以优化引用可空列查询,它会使索引、索引统计和值更加复杂。可空列需要更多的存储空间(见上面的e文),还需要mysql内部进行特殊处理。可空列被索引后,每条记录都需要一个额外的字节,还能导致MYisam 中固定大小的索引变成可变大小的索引。
You can add an index on a column that can have NULL values if you are using the MyISAM, InnoDB, or MEMORY storage engine. Otherwise, you must declare an indexed column NOT NULL, and you cannot insert NULL into the column.
你可以在包含NULL值的列上添加索引,如果您使用的是MyISAM、InnoDB或内存存储引擎。除此之外,必须声明索引列NOT NULL,并且不能将NULL插入该列。
索引包含一个或多个列的值。MySQL只能高效的利用索引的最左前缀列
索引的优势:
B+Tree
使用最多的索引类型,采用B-Tree数据结构来存储数据(每一个叶子节点都包含指向下一个叶子节点的指针,从而方便叶子节点的遍历)。B-Tree索引适用于全键值,键值范围,键前缀查找,支持排序
限制:
hash索引
只有精确匹配索引所有的列,查询才有效。存储引擎会对所有的索引列计算一个hash码,哈希索引将所有的哈希码存储在索引中,并保存指向每个数据行的指针
限制
优化建议:
查询质量的三个重要指标
查询优化的点
count(1)与count(*)得到的结果一致,包含null值。
count(字段)不计算null值
如:
select
id,
name,
age
where
student s1
inner join (
select
id
from
student
order by
age
limit 50,5
) as s2 on s1.id = s2.id
1)、在两个表差不多大的时候,in和 exists 没区别
2)、在外表比内表大时,如 select * from a where (select name from b where id = 2)
a 表大于 b 表,这种用in
3)、外表比内表小,用 exists
1、隐式转换
条件中的字段类型和表结构类型不一致,MySQL 会自动加转换函数,导致索引作为函数中的参数失效
2、like
查询前面部分未输入,以% 开头无法命中索引
3、5.7 版本的一个特性
支持JSON 格式数据,并提供相关内置函数
create table json_test (name JSON );
insert into json_test values ('{"name":"value1", "name2":"value2"}');
select * from json_test where JSON_CONTAINS (name,'$.name1');
4、关注 explain 在性能分析中的使用
1)select_type
simple 表示简单的select ,没有union 和子查询
primary 有子查询,最外面的 select 查询就是 primary
union union中的第二个或随后的select 查询,不依赖外部查询的结果
dependent union union 中的第二个或随后的 select 查询,依赖外部查询结果
2)type
system 表仅有一行(=系统表),这是const 连接类型的一个特例
const 常量查询
ref 非谓语索引访问,只有普通索引
eq_ref 使用唯一索引或组件查询
all 全表查询
index 根据索引查询全表
range 范围查询
3)possible_keys
表中可能存在帮助查询的索引
4)key
选择使用的索引
5)key_len
使用索引的长度 ,如果是聚合索引,能根据这个判断走的什么索引,(a,b) a a,b
6)rows
扫描的行数,越大越不好
7)extra
Only index 信息从索引中检索出,比扫描表快
where used 使用 where 限制
Using filesort 可能存在内存或磁盘排序
Using temporary 对查询结果排序时使用临时表
需求
1、乘客通过网站注册登录
2、实名认证通过mork实现
3、铁路部门管理员有如下功能
4、定时任务:生成火车票
5、普通用户拥有如下功能
6、支付成功后通知用户
分析:
名词:实体、属性
动词:关系
设计数据库的时候要满足范式
不忘初心,方得始终;初心易得,始终难守。