您的位置:首页 > 数据库 > MySQL

mysql优化

2012-09-28 16:23 148 查看
为了能更好的提升mysql数据的性能,我认为mysql数据库的优化尤为重要,从表的设计,到数据的查询每一个过程都设计到数据库的优化,大概有以下几点:
第一:数据表和库的类型的选择:
选择合适的表的类型,防止数据文件中产生碎块,同样可以大大优化检索的速度,是数据库的性能最大化。
(1)静态MyISAM。这种格式是最简单且最安全的格式,它也是在磁盘格式最快的。速度来自于数据能在磁盘上被找到的难易方式。当所定有一个索引和静态格式的东西时,它很简单,只是行长度乘以行数量。而且在扫描一张表时,用每次磁盘读取来读入常数个记录是很容易的。
(2)静态定长表的特点:表中所有的列不包含VARCHAR、BLOB或TEXT类型。非常快,容易缓冲,在崩溃之后容易重建。
(3)动态MYISAM.这种格式有点复杂,因为每一行必须有一个头说明它有多长。要不断的统计其长度。
(4)动态MYISAM的特点:表中所有的列包含VARCHAR、BLOB或TEXT类型。所有的字符串列是动态的,每个记录尽展有所需的长度,如果一个记录变得更大,它按需要被切开多段,这导致记录碎片。
对表的长期使用,由于记录的删除与插入,会在表的数据文件产生碎片,下面的几种情况尤其会有产生碎片的效果:
使用VARCHAR类型,频繁使用可变长列的结果就是使表非常容易产生碎片,如果空间允许,尽量采用定长类型CHAR。
使用类型BLOB和TEXT,特别是进行大量的DELETE 或UPDATE 操作时更是如此。删除BLOB 会在表中留下一个大空白,在以后将需用一个记录或可能是不同大小的多个记录来填充。删除了一个表的大部分,这同样会在表中留下大量空白。

第二:创建表类型的选择
(1)是某一个字段的值尽量小。这样才能使你的数据在硬盘和内存中占的空间尽量的小,如果在该字段上做索引的话,占用的空间也相对较小;
(2)使用定长列,不使用可变列。最常见的是VARCHAR 和CHAR ,应该选择CHAR 列而不选择VARCHAR 列。所要权衡的是使用定长列时,表所占用的空间更多,但如果能够承担这种空间的耗费,使用定长行将比使用可变长的行处理快得多。而且在设计过程中,像一些固定长度的字段最好不要用VARCHAR,因为可变列容易产生较多的碎片,严重影响查询效率;
(3)将列定义为NOT NULL。因为在查询过程中,都要判断该列是否为空,所以如果将全部列设计成NOT NULL 能减少查询的时间,优化查询;
(5)考虑应用ENUM。如果某一个列含有特定的几个值,应该考虑将其设计成ENUM 类型,能更快的处理;
(6)BLOB 和TEXT类型的优点。用 BLOB 存储应用程序中包装或未包装的数据,有可能使原来需要几个检索操作才能完成的数据检索得以在单个检索操作中完成。而且还对存储标准表结构不易表示的数据或随时间变化的数据有帮助。另一方面,BLOB 值也有自己的固有问题,特别是在进行大量的DELETE 或UPDATE 操作时更是如此。删除BLOB 会在表中留下一个大空白,在以后将需用一个记录或可能是不同大小的多个记录来填充。除非有必要,否则应避免检索较大的BLOB 或TEXT 值。因此对容易产生碎片的表使用 OPTIMIZE TABLE。

总结:大量进行修改的表,特别是那些含有可变长列的表,容易产生碎片。碎片不好,因为它在存储表的磁盘块中产生不使用的空间。随着时间的增长,必须读取更多的块才能取到有效的行,从而降低了性能。任意具有可变长行的表都存在这个问题,但这个问题对BLOB 列更为突出,因为它们尺寸的变化非常大。经常使用OPTIMIZE TABLE 有助于保持性能不下降。一般情况下如果表中包含BLOB 这种大类型的数据,应该考虑是否建立一个附表,条件是移出BLOB 列后可将表转换为定长行格式。这样会减少主表中的碎片,而且能利用定长行的性能优势。

第三:SQL查询语句的优化

(1)使用mysql 自带工具explain 来检查查询语句的效率,通过对sql 的分析,来进行处理。
(2)SELECT语句的优化。当select 查询变慢的时候,首先应该想到的是,能否创建一个索引:
(3)插入数据和修改数据的速度。成批插入数据较单行插入数据更快,因为在插入每个记录后,不需要刷新索引高速缓存;可在成批记录插入后才刷新。在表无索引时插入数据比索引后装载更快。如果有索引,不仅必须增加记录到数据文件,而且还要修改每个索引以反映增加了的新记录。较短的SQL 语句比较长的SQL 语句要快,因为它们涉及服务器方的分析较少,而且还因为将它们通过网络从客户机发送到服务器更快。

1,insert插入的速度由以下几个方面构成:(1)链接,发送请求给服务器,分析sql语句,插入记录,插入索引,关闭。
2,加快插入的方法:(1)尽可能多的一次性插入多行,比循环插入效果更好
(2)当从一个文本文件装载一个表时,使用LOAD DATA INFILE。这通常比使用很多INSERT语句快20倍。因为他不更新任何索引。
(4)索引对数据插入的影响:如果表是索引的,则可利用批量插入(LOAD DATA 或多行的INSERT 语句)来减少索引的开销。这样会最小化索引更新的影响,因为索引只需要在所有行处理过时才进行刷新,而不是在每行处理后就刷新。如果需要将大量数据装入一个新表,应该创建该表且在未索引时装载,装载数据后才创建索引,这样做较快。一次创建索引(而不是每行修改一次索引)较快。如果在装载之前删除或禁用索引,装入数据后再重新创建或启用索引可能使装载更快。

第四 索引的优化:
对数据库查询来说索引是加快查询的最重要的工具,还有其他加快查询的技术,但是最有效的莫过于恰当地使用索引了。所有的MySQL索引(PRIMARY、UNIQUE和INDEX)在B树中存储。
(1)索引的应用:快速的匹配出一个where字句的行;在多个表查询中加快了与其他链接的速度;对特定的索引列找出MAX()或MIN();
(2)索引的弊端:索引文件要占磁盘空间。如果有大量的索引,索引文件可能会比数据文件更快地达到最大的文件尺寸;索引文件加快了检索,但增加了插入和删除,以及更新索引列中的值的时间(即,降低了大多数涉及写入的操作的时间),因为写操作不仅涉及数据行,而且还常常涉及索引。
(3)选择索引的准则:1,where字句中的列或链接字句中的列最适合做索引;对于惟一值的列,索引的效果最好,而具有多个重复值的列,其索引效果最差;2如果对串列进行索引,应该指定一个前缀长度,只要有可能就应该这样做。例如,如果有一个CHAR(200) 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。对前10 个或20 个字符进行索引能够节省大量索引空间,也可能会使查询更快。较小的索引涉及的磁盘I/O 较少,较短的值比较起来更快;3索引可用于“<”、“<=”、“=”、“>=”、“>”和BETWEEN 运算。在模式具有一个直接量前缀时,索引也用于LIKE 运算。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: