标签:time 外键 例子 mic 长度 分配 img 总结 前言
? 数据库(Database)是按照数据结构来组织、存储和管理数据的仓库。
? MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于 Oracle 公司。MySQL 是一种关联数据库管理系统,关联数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内,这样就增加了速度并提高了灵活性。
本篇博客是总结MySQL存储机制及SQL优化方面的内容。
?
? 分析:
? 缓存:当客户端请求到来时,先去查询缓存中是否存在数据,没有再去数据库中查询。
分析器:对sql语句的分析,比如SELECT username FROM users; ,分析器分析出先执行FROM users,然后再执行SELECT username。
? 优化器:上面只是举了一个简单的例子,而优化器作用在于选择那种执行方式,是执行SQL效率最快的。因为分析器对一条SQL语句会分析出多种不同的结果,而优化器就会对以上的分析结果选择它认为最优的结果来执行。但是,需要注意的是,优化器认为最优的执行方案,并不一定是我们认为的最优执行方案。因此再SQL语句量较大的情况下,就需要程序员手动对语句进行优化。
? 下面再来说说MySQL的存储引擎。
? 以博主的MySQL作为案例,执行select version();
语句可以查看数据库版本。
?
? 接着再来看看MySQL都支持哪些存储引擎。
?
? 在倒数第二个,可以看出MySQL默认的存储引擎是InnoDB,再细看Transactions
中只有InnoDB是支持事务的,其他存储引擎都是不支持的。这是在MySQL5.5之后支持的引擎,所以说在5.5之前MySQL是不支持事务的。
? 最长用的两种存储引擎为InnoDB和Myisam,请看两者之间的区别(MySQL5.6)。
特点 | InnoDB | myisam |
---|---|---|
事务 | 支持事务 | 不支持 |
锁 | 行锁 | 表锁 |
B树索引 | 支持 | 支持 |
全文索引 | 不支持 | 支持 |
外键 | 支持(唯一支持的) | 不支持 |
? 那么如何选择两种存储引擎,可以从以下几个方面考虑。
? 事务:
? 如果应用需要事务支持,那么InnoDB是较号的选择。如果不需要事务,并且主要是select和insert操作,则MyISAM是个不错的选择,比如日志型系统。
? 备份:
? 备份的需求也会影响存储引擎的选择。如果需要在线热备份,则选择InnoDB就是基本的要求。
? 数据恢复:
? 数据量比较大的时候,系统崩溃后如何快速恢复是一个需要考虑的额问题。相对而言,MyISAM崩溃后发生损坏的概率比InnoDB高的多,而且恢复也慢,因此即使不需要事务,通常也应该选择InnoDB引擎。
? 对于不同存储引擎的选择,对数据库的性能都会带来较大的影响,除了MySQL默认支持的存储引擎之外,还有很多第三方存储引擎。
? 通常情况下,导致SQL性能下降还有以下几方面:
下面总结一些关于SQL优化方面的内容。
? 更小的通常更好:
? 一般情况选择可以正确存储数据的最小数据类型。因为更小的数据类型通常更快,因为占用磁盘、内存和CPU缓存会越小。
? 简单就好:
? 简单数据类型的操作通常需要更少的CPU消耗。
? 尽量避免NULL:
? 一般情况下最好执行列为NOT NULL,除非特殊需要。因为如果查询中包含为NULL的列,从SQL优化角度考虑,对创建索引,索引的统计等都会带来较大的困难,且优化起来也是较为复杂的,因此说尽量避免NULL值。
? 1,整数类型:选择合适的字节大小作为数据的类型。
tinyint:
8位字节smallint:
16位字节mediumint:
24位字节int:
32位字节bigint:
64位字节unsigned属性:
添加unsigned属性表示该字段不允许负数,正数的上限大致可以提高一倍。int(11)是指定整数类型的宽度,它不会限制值得合法范围,对于存储和计算而言,int(1)和int(20)没什么区别
? 2,实数类型
float:
32位double:
64位decimal:
decimel需要额外的空间和计算开销,所以应该尽量只对小数进行精准计算时才使用decimel,例如存储金额。? 3,字符串类型
varchar:
是可变长的字符串,它比定长更节省空间。varchar需要使用1~2个额外字节记录字符串的长度。varchar节省了存储空间,所以对性能也有帮助,char:
定长字符串,mysql根据定义的字符串长度分配足够的空间。blob和text:
两者都是用于存储很大的数据而设计的字符串数据类型,varchar(5)和varchar(200)存储‘hello‘的空间开销是一样的。但是varchar(5)对性能提升有很大的优势。更长的列会消耗更多的内存,因为mysql通常会分配固定大小的内存块来保存内部值。尤其是使用内存临时表进行排序等操作时会特别糟糕。所以最好的策略是只分配真正需要的空间
? 4,时间和日期类型
datetime:
能保存大范围的值,从1001年到9999年,精度为秒。它把日期和时间封装到YYYYMMDDHHMMSS的整数中,使用8个字节的存储空间 。timestamp:
保存了从1970年1月1日以来的毫秒数,timestamp只使用了4个字节的存储空间,因此它的范围比datetime小的多;但是只能表示从1970年到2038年。另外timestamp也依赖于时区。除了特殊行为之外,通常应该尽量使用timestamp,
因为它比datetime空间效率更高。
? 下面将总结索引方面的优化,包括B-Tree和B+Tree两种数据结构的原理,由于放在一起篇幅较长,所以就分成两个博客,这些内容会在下一篇博客中进行详细总结。
? 以上内容均是自主学习总结,如有不适之处,欢迎留言指正。
感谢阅读!
标签:time 外键 例子 mic 长度 分配 img 总结 前言
原文地址:https://www.cnblogs.com/fenjyang/p/11552412.html