高性能MySQL--选择标识符

为标志列(外键列)选择合适的数据类型非常重要。

1.在相关的表中使用相同的数据类型,因为这些列很可能在关联中使用。混用数据类型可能导致隐式类型转换错误。

2.MySQL在内部使用整数存储ENUM和SET类型,然后在作比较操作时转换为字符串。

3.在可以满足值的范围的需求,并且预留未来增长空间的前提下,应该选择最小的数据类型。

4.通常来说整数是标志列最好的选择,因为他们很快并且可以使用auto_increment。

5.大部分情况下都要避免使用ENUM或者SET作为标志列的数据类型。

6.如果可能应该避免字符串类型作为标志列,因为他们很消耗空间,并且通常比数字类型慢。尤其是在MyISAM表里使用字符串作为标志列时要特别小心。MyISAM默认对字符串使用压缩指引,这会导致慢的很多。大概6倍的性能下降。

7.对于完全‘随机’的字符串也要多加小心,例如MD5(),SHA1()或者UUID()产生的字符串,这些函数产生的字符串会任意分布在很大的空间,这会导致INSET和SELECT语句变得很慢。

  • 因为插入值会随机写到索引的不同位置,所以使得INSERT语句变慢。这会导致页分裂,磁盘随机访问,以及对于聚簇存储产生聚簇索引碎片。
  • SELECT语句变慢,因为逻辑上相邻的行会分布在磁盘和内存的不同地方。
  • 随机值会导致缓存对所有类型的查询语句效果都很差,因为会使得缓存赖以工作的访问局部性原理失效。

8.如果使用UUID字符串作为标志列(外键),这应该移除“-”符号;或者更好的做法是,用UNHEX()函数将字符串转换为16字节的数字,并存储在一个BINARY(16)列中。检索时可以通过HEX()函数来格式化十六进制格式。

9.当心自动生成的schema。对象关系映射(ORM)系统是一种常见的性能噩梦。一些ORM系统会存储任意类型的数据到任意类型的后端数据存储中,这通常意味着其没有设计使用更好更优的数据类型来存储。有时会为每个对象的每个属性使用单独的行,甚至使用基于时间戳的版本控制,导致单个属性会有多个版本存在。这种“对开发者隐藏复杂性”的应用通常不能很好地扩展。

10.IPv4地址存储。人们通常使用VARCHAR(15)列来存储IP地址。然而,他们实际上是32位无符号整数,不是字符串。用小数点将地址分割成四段的表示方法只是为了让人们容易阅读。所以应该使用无符号整数存储IP地址。MySQL提供INET_ATON()和INET_NTOA()函数在这两种表示方法间转换。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值