MySQL优化表结构优化的5大建议(好的数据类型选择)
由于MySQL数据库是基于(行)数据库,以及数据库IO操作是基于网页(块)模式,也就是说,如果我们的每个记录占用的空间量会降低,会使存储的每个页面数量增加的数据,所以每个IO可访问的行的数量也有所增加。相反,处理相同数量的数据,需要访问的页面将减少,即减少IO操作数,且性能直接提高。另外,因为我们的记忆是有限的,增加数据行存储在每个页面的数量是相等的增加每个内存块的数据量,提高数据打在内存转换,即概率,缓存命中率。
1。数据类型的选择
数据库操作最耗时的操作是IO处理,大部分数据库操作超过90%的时间花在IO读写上,因此尽可能减少IO的读写量,可以大大提高数据库操作的性能。
我们不能改变,需要存储在数据库中的数据,但我们可以花一些时间在这些数据的存储。下列关于字段类型主要用于记录和大量数据的大量场景的优化建议,因为好的数据类型设置可能带来的维护成本的提高,在优化可能会带来其他问题。
1:非数值类型不能,但不能使用双倍,不仅存储长度,而且也有问题的准确性。同样,不建议使用十进制小数的固定精度小数。建议乘固定多为整数的存储,大大节省存储空间,不会带来任何额外的维修费用。为整数的存储,在数据量大的情况下,建议将TINYINT / INT或BIGINT的选择,因为由三所占用的存储空间也有很大的不同,这是肯定的,没有负数的领域都会用到。建议添加无符号定义。当然,如果数据库中有少量数据,也不能严格区分三个整数类型。
2。字符类型:非万不得已不要使用文本数据类型的方法决定其性能不及CHAR或VARCHAR类型的治疗,固定长度的字段,建议使用char类型,不定长字段使用varchar,只设置最合适的长度,而不是很随便的一个大的最大长度的限制,因为不同的长度范围内,MySQL将有不同的存储处理。
三.时间型:使用时间戳类型尽可能多的,因为其存储空间只需要一半的DateTime类型,数据类型需要精确到某一天,这是推荐使用的数据类型,因为其存储空间只需要3字节,小于时间戳。不推荐存储一个Unix时间戳值通过int类,因为它太不直观,会带来不必要的麻烦来维护,它不会同时带来任何好处。
4.enum集的状态字段,您可以尝试使用枚举来存储,因为它可以大大减少存储空间,甚至如果你需要增加新的类型,只要添加,修改结构不需要重建表数据。如果它是存储预定义的属性数据你可以尝试使用设置类型,即使有各种属性,它也可以很容易,并且可以节省一点存储空间。
5.lob型:强烈反对存储LOB数据类型的数据库。虽然数据库提供了这样的功能,但这并不是他擅长的。我们应该让合适的工具做他擅长的,所以我们可以发挥到了极限。在数据库中存储LOB数据就像让营销专业人士在学校学到年前一些java写的java代码。
二、字符编码
字符集编码直接决定在MySQL数据的存储,因为使用不同的字符集相同的内容显示的占用空间会有较大的差异,因此通过适当的字符集的使用,可以帮助我们尽可能减少数据量,进而减少IO操作数。
1。纯拉丁字符可以表达,也不需要选择其他字符码外latin1,这节省了大量的存储空间。
2,如果我们可以肯定的是,我们不需要存储多语言,不需要使用UTF8或其他Unicode字符类型。这样会造成大量的存储空间浪费。
的3.mysql数据类型可以精确到字段,所以当我们需要存储在数据库中的多字节数据,可以利用在不同的数据类型,大大减少了数据存储量不同的领域不同的表,从而减少IO操作的数量和提高缓存命中率
三。适当的分离
有时,我们可能希望将完整的对象与数据库表匹配,这有利于应用程序开发,但有时也会给性能带来很大的问题。
当类似于文本或varchar类型领域存在在我们的桌子,如果我们访问表的大部分时间你不需要这个领域,我们应该毫不犹豫地分裂成单独的表中,为了减少公共数据占用的存储空间。这一方式的优点是存储在每个数据块的数量可以大大增加,这可以减少物理IO次数,提高缓存命中率在记忆。
以上几点进行优化,降低每个记录存储空间的大小,让更多的记录可以存储在不同的数据库,从而减少IO操作和提高缓存命中率。以下优化建议可能不被许多开发商的理解,因为这是一个典型的反范式设计,和这也与上面几个优化建议。
四,适度冗余
为什么我们必须是多余的这是否增加了每个数据的大小,并减少了每个数据块可以存储的记录数
事实上,这样做将增加每个记录的大小,并减少可以存储在每个记录中的数据的数量,但在某些情况下,我们仍然需要这样做。
经常被引用的独立的小字段,只能通过联接2(或更多)大表获得。
这样的场景,因为每个连接只是为了获得一个小字段的值,加入的记录是大的,这将导致很多不必要的IO。它可以通过时间空间的方式进行优化,但是冗余也需要确保数据的一致性不会被破坏,确保更新更新时冗余字段的更新。
五。尽量不要使用null。
空类型是非常特殊的,和SQL是很难优化。虽然MySQL null类型不同于Oracle的空,它将进入指数,但如果它是一个综合指数,null类型字段将大大影响整个指数的效率。此外,在指数空的处理也非常特殊,它也需要额外的存储空间。
很多人认为空会节省一些空间,所以尽量让空节省IO,但大多数时候会适得其反,虽然空间可能确实有一些积蓄,它带来了很多其他的优化问题,不仅将IO,但增加了IO SQL的量。所以尽量保证这个默认值是无效的,这也是一个很好的表结构设计优化的习惯。