在这里我们谈一谈MySQL的性能优化!
1.1MySQL逻辑架构
如上是MySQL的逻辑架构图
最上层的服务并不是MySQL所独有的,大多数基于网络的客户端/服务器的工具或者服务都有类似的架构。比如链接处理,授权认证,安全等。
第二层架构是MySQL比较重要的部分。大多数MySQL的核心服务功能都在这一层,包括查询解析,分析,优化,缓存以及所有的内置函数(列如:日期,时间,数学和加密函数),所有跨存储引擎的功能都在这一层实现:存储过程,触发器,视图等。
第三层包含了存储引擎。存储引擎负责MySQL中数据的存储和提取。
1.2选择优化的数据类型
MySQL支持的数据类型非常的多,选择正确的数据类型十分的重要,当你不知道该如何去确定数据类型的时候,那么可以参考下下边的简单原则
· 更小的通常更好
一般情况下,尽量选择可以使用的最小的数据类型,举个例子,假如我们需要代表我国省份编号的provice字段,这里我们知道中国所有省市自治区才32个,因此我们大可以用TINYINT类型,这样就比INT类型节约了三个字节
· 简单就好
简单数据类型的操作对于CPU的周期来说更加的友好,因此能用数字类型就不要用VARCHAR类型,毕竟VARCHAR类型还得有字符集和校对规则。再比如,我们可以使用MySQL的内部的时间类型DATE、TIMESTAMP类型来存储时间,而不是用VARCHAR类型
· 尽量避免NULL
在我们设计表结构的时候,有很多字段设置的默认值都是NULL。通常情况下,如果我们并非十分的需要NULL类型,那么指定类型为NOT NULL是一个较好的方案。与此同时,NULL值得存在,不利于索引性能的发挥,当有NULL值的时候,每个索引记录需要一个额外的字节。
在选择大的数据类型时往往很容易,但是涉及到一些具体的情况的时候,往往很难选择。
列如:DATETIME和TIMESTAMP列都可以存储相同类型的数据:时间和日期,精确到秒,但是TIMESTAMP所占用的存储空间仅为DATETIME属性的一半,当然它表示的范围也比较小,这时候选择就必须根据具体情况具体分析了
4.1.1整数类型
类型 | 大小(Byte) | 范围 |
---|---|---|
TINYINT | 1 | -128~127 |
SMALLINT | 2 | -32768~32767 |
MEDIUMINT | 3 | -8388608~8388607 |
INT | 4 | -2147483648~2157483647 |
BIGINT | 8 | -2^32~2^32-1 |
4.1.2实数类型
类型 | 大小(Byte) |
---|---|
FLOAT | 4 |
DOUBLE | 8 |
DECIMAL | >8 |
4.1.3字符串类型
4.1.3.1-VARCHAR与CHAR
VARCHAR
varchar类型用于存储可变长的字符串,越短的字符串使用越短的存储空间。在存储字符串的同时,varchar类型还需要额外的空间来存储该字符串的长度,在latin1字符集的情况下,varchar(10)需要消耗11个字节的空间而varchar(1000)需要1002个字节的空间。
CHAR
char类型用于存储定长的字符串,常用在存储定长的UUID上,或者平均长度很接近的字符串。
以上便是varchar和char类型的具体区别,varchar和char类型还有一个重要的区别,varchar类型会有自动省略字符串末尾的空格,而char类型会将字符串末尾的空格保留。
与varchar和char类型类似的还有BINARY和VARBINARY类型,他们存储的是二进制的字符串。
4.1.3.2-BLOB与TEXT
BLOB和TEXT都是为了很大的数据而设计的字符串数据类型,分别采用二进制和字符方式存储。