MySQL 结构的优化方案

主要是指三方面,即表结构、字段结构以及索引结构,这些结构如果不合理,在某些场景下也会影响数据库的性能,因此优化时也可以从结构层面出发。一般在项目的库表设计之初就要考虑,当性能瓶颈出现时再调整结构,就为时过晚。

1. 表结构的优化

表结构设计时字段数量一定不要太多,InnoDB引擎基本上都会将数据操作放到内存中完成,一张表的字段数量越多,能载入内存的数据页会越少,当操作时数据不在内存,又不得不去磁盘中读取数据,这显然会很大程度上影响MySQL性能。

表结构的设计,正常情况下应当遵循《数据库三范式》的原则设计,尽可能的根据业务将表结构拆分的更为精细化,一方面确保内存中缓存的数据更多,更便于维护,而且执行SQL时,效率也会越高。

主键选择要合适,一张表中必须要有主键且最好是顺序递增的。一张表如果业务中自带自增属性字段,最好选择这些字段作为主键。没有可以设计一个与业务无关、无意义的数值序列。

对实时性要求不高的数据建立中间表。很多时候为了统计一些数据时,都会基于多表做联查,以此来确保得到统计所需的数据,对于实时性的要求不高,可以在库中建立相应的中间表,然后每日定期更新中间表的数据,从而减小联表查询的开销,同时也能进一步提升查询速度。

根据业务特性为不同的表选择合适的存储引擎,主要在InnoDB、MyISAM之间做选择。经常查询,很少发生变更的表可以选择MyISAM引擎。其他表可以使用默认的InnoDB引擎。

2. 字段结构的优化

设计表时选择合适的数据类型

  • 姓名字段,一般都会限制用户名长度,不要无脑用varchar,使用char类型更好。
  • 一些显然不会拥有太多数据的表,主键ID的类型可以从int换成tinyint、smallint、mediumit。
  • 日期字段,不要使用字符串类型,更应该选择datetime、timestamp,一般情况下最好为后者。
  • 一些固定值的字段,如性别、状态、省份、国籍等字段,可以选择使用数值型代替字符串,如果必须使用字符串类型,最好使用enum枚举类型代替varchar类型。

总之保持三个原则

  1. 足够的使用范围内选择最小的数据类型,它们占用更少的磁盘、内存、和CPU缓存,处理速度也会更快
  2. 避免索引字段值为NULL,字段空值过多会影响索引性能
  3. 尽量使用简单的类型代替复杂的类型,如IP的存储可以使用int而并非varchar,因为简单的数据类型,操作时通常需要的CPU资源更少。

3. 索引结构的优化

根据业务创建更合适的索引,主要从4个方面考虑:

  1. 一个表需要建立多个索引,适当根据业务将多个单列索引组合成一个联合索引,可以节省磁盘空间,能够充分使用索引覆盖的方式查询数据,一定程度上提升数据库的整体性能。
  2. 值较长的字段尽量建立前缀索引,索引字段值越小,单个B+Tree的节点中能存储的索引键会越多,索引树会越矮,查询性能自然越高。
  3. 经常做模糊查询的字段,可以建立全文索引代替普通索引,基于普通索引做like查询会导致索引失效,而采用全文索引的方式做模糊查询效率会更高更快,并且全文索引的功能更为强大。
  4. 索引结构的选择根据业务进行调整,在某些不做范围查询的字段上建立索引时,可以选用hash结构代替B+Tree结构,Hash结构的索引是所有数据结构中最快的,散列度足够的情况下,复杂度仅为O(1)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值