Mysql 优化

选择合适的数据类型

  • 更小的更好: 正确的选择最小的存储结构。最小的通常更快并且占用磁盘,内存的空间会让cpu 的处理更短。但当无法确定类型的大小时,最好不要这么做。后期的修改会很痛苦。
  • 使用简单类型: 简单类型通常使用更少的cpu 周期。比如 整形比字符型操作的cpu 代价更低。因为字符型会使用Mysql 的字符集和排序规则,而这些整形中是没有的。如果需要使用时间类型,最好用mysql 中的 date ,time ,datetime 。这样也是一种优化。
  • 结果集中最好不要有null : 对于mysql 来说,null 值很难优化,除非必要,否则最好不要存在。因为当获取null 时mysql 会去给每个null 值 增加额外字段。 null 列会使用更多的存储空间,获取索引和索引统计时会做较为复杂的比较。
  • 针对于MyISAM 最好不要使用MD5() ,SHA1(),UUID() 函数产生字符串,这些会随机分配任意空间,导致INSERT 和SELECT 语句很慢。 INSERT 的时候写到的索引位置不同,会造成页分裂和磁盘随机访问 。select 变慢也是因为逻辑上相同的行会在物理上分配在不同的地方。
  • 最好使用无符号整数存储IP地址。

mysql 中的类型

整数类型

整数可使用的类型: TINYINT , SMALLINT, MEDIUMINT, INT ,BIGINT。 对应8,16,24,32,64 存储空间。
mysql 的整形设计 int(11) 不会限制值得合法性,只会显示字符的个数不同,int(1) 和 int(11) 的存储空间是相同的。


实数类型

带了小数的数字。如 DECIMAL,FlOAT,DOUBLE

  • DECIMALL : 可以指定小数点的前后允许的最大位数。但这会增加列的空间消耗。小数点前的会用打包放入一个二进制字符串中,小数点后也会这样,而且小数点本身也会占用一个字节。DECIMALL是一种存储方式,在计算时会转换成double. 所以在存储时,其他的浮点类型都会比 DECIMALL 使用更少的空间。如果需要精确的度数比较高, 可以考虑使用BIGINT 代替DECIMALL 的小数点形式。 如需要精确万分之一, 那么就使用结果乘上一万。

字符串类型

varchar 和 char 最主要的两个字符串类型。

  • varchar : 可变长字符串。通常varchar 在存储的时候需要额外的一个或两个字节,这个字节的变化是看存储量是否超过255 ,如超就2 个字节标识,否则就使用1个。如: varchar(10) 实际使用的是 11个存储空间, varchar(1000) 实际使用的是 1002个空间。当可变长的存储空间不够时,MyISAM 是拆分不同的片段存储, InnoDB 是分裂页。
  • char : 定长字符串。根据分配的长度进行存储。最好是用在存储短字符或者长度一致的字符。因为短,所以可以使用更少的碎片空间, 不会像varchar 造成过多的碎片空间。在效率上 char 类型比 varchar 类型更快。
    varchar 和 char 都会删除存储数据的字符串后面的空格。

BLOB 和TEXT

BLOB 和TEXT 都是用在存储很大的数据而设计的字符串。采用二进制和字符串存储。
BLOB 存储二进制,没有排序规则
TEXT: 有排序规则
BLOB 和TEXT 最好避免使用,如果是非用不可的情况下,最好的查询的情况时,使用SUBSTRING() 去截取字符串,order by 里也要写,并且要保证足够短。这样做的目的是为了使用内存表而不是让mysql 自己去创建使用磁盘表。磁盘会比内存运行慢。(当EXPLAIN 执行显示 Using temporary 说明使用了隐式临时表。超过 max_heap_table_size 或 tmp_table_size 后,会从内存临时表变为磁盘临时表)


枚举类型

会按照 数字- 字符串的 形式映射关系。 主要是一些不重复的常用字符可以考虑使用。

-- 这三个字符串实际 是 1-fish, 2-apple, 3-dog 而存入内部存储的 实际是前面的数字
mysql> CREATE TABLE enum_table(
    ->  e ENUM('fish','apple','dog') NOT NULL
    -> );
Query OK, 0 rows affected (0.03 sec)

mysql> INSERT INTO enum_table(e) Values('fish'),('apple'),('dog');
Query OK, 3 rows affected 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值