MySQL优化之数据类型的使用

2016-02-19 19:50 4 1 收藏

想不想get新技能酷炫一下,今天图老师小编就跟大家分享个简单的MySQL优化之数据类型的使用教程,一起来看看吧!超容易上手~

【 tulaoshi.com - 编程语言 】

  有助于效率的类型选择

  1、使你的数据尽可能小

  最基本的优化之一是使你的数据(和索引)在磁盘上(并且在内存中)占据的空间尽可能小。这能给出巨大的改进,因为磁盘读入较快并且通常也用较少的主存储器。如果在更小的列上做索引,索引也占据较少的资源。

  你能用下面的技术使表的性能更好并且使存储空间最小:

  ·尽可能地使用最有效(最小)的类型。MySQL有很多节省磁盘空间和内存的专业化类型。

  ·如果可能使表更小,使用较小的整数类型。例如,MEDIUMINT经常比INT好一些。

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  ·如果可能,声明列为NOT NULL。它使任何事情更快而且你为每列节省一位。注意如果在你的应用程序中你确实需要NULL,你应该毫无疑问使用它,只是避免缺省地在所有列上有它。

  2、使用定长列,不使用可变长列

  这条准则对被经常修改,从而容易产生碎片的表来说特别重要。例如,应该选择 CHAR 列而不选择 VARCHAR 列。所要权衡的是使用定长列时,表所占用的空间更多,但如果能够承担这种空间的耗费,使用定长行将比使用可变长的行处理快得多。

  3、将列定义为 NOT NULL

(本文来源于图老师网站,更多请访问http://www.tulaoshi.com/bianchengyuyan/)

  这样处理更快,所需空间更少。而且有时还能简化查询,因为不需要检查是否存在特例 NULL。

  4、考虑使用 ENUM 列

  如果有一个只含有限数目的特定值的列,那么应该考虑将其转换为 ENUM 列。ENUM 列的值可以更快地处理,因为它们在内部是以数值表示的。

  有关BLOB和TEXT类型

  1、使用BLOB和TEXT类型的优点

  用 BLOB 存储应用程序中包装或未包装的数据,有可能使原来需要几个检索操作才能完成的数据检索得以在单个检索操作中完成。而且还对存储标准表结构不易表示的数据或随时间变化的数据有帮助。

  2、使用BLOB和TEXT类型的可能弊端

  另一方面,BLOB 值也有自己的固有问题,特别是在进行大量的 DELETE 或 UPDATE 操作时更是如此。删除 BLOB 会在表中留下一个大空白,在以后将需用一个记录或可能是不同大小的多个记录来填充。

  除非有必要,否则应避免检索较大的 BLOB 或 TEXT 值。例如,除非肯定WHERE 子句能够将结果恰好限制在所想要的行上,否则 SELECT * 查询不是一个好办法。这样做可能会将非常大的 BLOB 值无目的地从网络上拖过来。这是存储在另一列中的 BLOB 标识信息很有用的另一种情形。可以搜索该列以确定想要的行,然后从限定的行中检索 BLOB 值。

  3、必要的准则

  对容易产生碎片的表使用 OPTIMIZE TABLE

  大量进行修改的表,特别是那些含有可变长列的表,容易产生碎片。碎片不好,因为它在存储表的磁盘块中产生不使用的空间。随着时间的增长,必须读取更多的块才能取到有效的行,从而降低了性能。任意具有可变长行的表都存在这个问题,但这个问题对 BLOB 列更为突出,因为它们尺寸的变化非常大。经常使用 OPTIMIZE TABLE 有助于保持性能不下降。

  使用多列索引

  多列索引列有时很有用。一种技术是根据其他列建立一个散列值,并将其存储在一个独立的列中,然后可通过搜索散列值找到行。这只对精确匹配的查询有效。(散列值对具有诸如“”或“=”这样的操作符的范围搜索没有用处)。在MySQL 3.23版及以上版本中,散列值可利用 MD5( ) 函数产生。散列索引对 BLOB 列特别有用。有一事要注意,在 MySQL 3.23.2 以前的版本中,不能索引 BLOB 类型。甚至是在 3.23.2 或更新的版本中,利用散列值作为标识值来查找 BLOB 值也比搜索 BLOB 列本身更快。


  将 BLOB 值隔离在一个独立的表中

  在某些情况下,将 BLOB 列从表中移出放入另一个副表可能具有一定的意义,条件是移出 BLOB 列后可将表转换为定长行格式。这样会减少主表中的碎片,而且能利用定长行的性能优势。

  使用ANALYSE过程检查表列

  如果使用的是 MySQL 3.23 或更新的版本,应该执行 PROCEDURE ANALYSE( ),查看它所提供的关于表中列的信息

  ANALYSE([max elements,[max memory]])

  它检验来自你的查询的结果并返回结果的分析。

  max elements(缺省256)是analyse将注意的每列不同值的最大数量。这被ANALYSE用来检查最佳的列类型是否应该是ENUM类型。

  max memory(缺省8192)是在analyse尝试寻找所有不同值的时候应该分配给每列的最大内存量。

  SELECT ... FROM ... WHERE ... PROCEDURE ANALYSE([max elements,[max memory]])

  例如:

  mysqlSELECT * FROM student PROCEDURE ANALYSE();

  mysqlSELECT * FROM student PROCEDURE ANALYSE(16,256);

  相应输出中有一列是关于表中每列的最佳列类型的建议。第二个例子要求 PROCEDURE ANALYSE( ) 不要建议含有多于 16 个值或取多于 256 字节的 ENUM 类型(可根据需要更改这些值)。如果没有这样的限制,输出可能会很长;ENUM 的定义也会很难阅读。

  根据 PROCEDURE ANALYSE( ) 的输出,会发现可以对表进行更改以利用更有效的类型。如果希望更改值类型,使用 ALTER TABLE 语句即可。

来源:http://www.tulaoshi.com/n/20160219/1621962.html

延伸阅读
标签: MySQL mysql数据库
无论是在小得可怜的免费数据库空间或是大型电子商务网站,合理的设计表结构、充分利用空间是十分必要的。这就要求我们对数据库系统的常用数据类型有充分的认识。下面我就将我的一点心得写出来跟大家分享。 一、数字类型。数字类型按照我的分类方法分为三类:整数类、小数类和数字类。 我所谓的“数字类”,就是指DECIMAL和NUMERIC,它们...
很早以前在某大学BBS上下载的。刚才整理文件,又看到它了。贴上去,大家共享。 刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。 我们先定义一些常见类型变量借以说明 int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]="程佩君"; char temp[200]; char *buf; ...
算术表达式 是由算术运算符和括号连接起来的式子, 以下是算术表达式的例子: a+b (a*2)/c (x+r)*8-(a+b)/7 ++i sin(x)+sin(y) (++i)-(j++)+(k--) 赋值运算符和赋值表达式 简单赋值运算符和表达式,简单赋值运算符记为“=”。由“= ”连接的式子称为赋值表达式。其一般形式为: 变量=表...
基本运算符和表达式 运算符的种类、优先级和结合性 C语言中运算符和表达式数量之多, 在高级语言中是少见的。正是丰富的运算符和表达式使C语言功能十分完善。 这也是C语言的主要特点之一。 C语言的运算符不仅具有不同的优先级, 而且还有一个特点,就是它的结合性。在表达式中, 各运算量参与运算的先后顺序...
Java 语言有着与C语言类似的教强的数据处理能力,即它的数据类型和不同类型上的运算定义得较为齐全,Java内部的数据类型可以分为四大类:整数、浮点数、字符、布尔型。其中整数和浮点数两大类根据长度和精度的不同,还可以进一步划分为byte、int、short、long、float、和double几个具体的类型。具体可参看下表: Java的基本...

经验教程

380

收藏

61
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部