Mysql数据表的优化
2015-09-26 22:26
435 查看
优化表的数据类型
表需要使用何种数据类型,是需要根据应用来判断的。虽然应用设计的时候需要考虑字段的长度留有一定的冗余,但是不推荐让很多字段都留有大量的冗余,这样即浪费存储也浪费内存。
我们可以使用PROCEDURE ANALYSE()对当前已有应用的表类型的判断,该函数可以对数据表中的列的数据类型提出优化建议,可以根据应用的实际情况酌情考虑是否实施优化。语法:
SELECT * FROM tbl_name PROCEDURE ANALYSE();
SELECT * FROM tbl_name PROCEDURE ANALYSE(16,256);
输出的每一列信息都会对数据表中的列的数据类型提出优化建议。第二个例子告诉PROCEDURE ANALYSE()不要为那些包含的值多于16个或者256字节的ENUM类型提出建议。如果没有这样的限制,输出信息可能很长;ENUM定义通常很难阅读。
在对字段类型进行优化时,可以根据统计信息并结合应用的实际情况对其进行优化。
通过拆分,提高表的访问效率
这里我们所说的拆分,主要是针对Myisam类型的表,拆分的方法可以分成两种情况:
1) 纵向拆分:
纵向拆分是只按照应用访问的频度,将表中经常访问的字段和不经常访问的字段拆分成两个表,经常访问的字段尽量是定长的,这样可以有效的提高表的查询和更新的效率。
2) 横向拆分:
横向拆分是指按照应用的情况,有目的的将数据横向拆分成几个表或者通过分区分到多个分区中,这样可以有效的避免Myisam表的读取和更新导致的锁问题。
逆规范化
数据库德规范化设计强调数据的独立性,数据应该尽可能少地冗余,因为存在过多的冗余数据,这就意味着要占用了更多的物理空间,同时也对数据的维护和一致性检查带来了问题。
但是对于查询操作很多的应用,一次查询可能需要访问多表进行,如果通过冗余纪录在相同表中,更新的代价增加不多,但是查询操作效率可以有明显提高,这种情况就可以考虑通过冗余数据来提高效率。
使用冗余统计表
使用create temporary table语法,它是基于session的表,表的数据保存在内存里面,当session断掉后,表自然消除。
对于大表的统计分析,如果统计的数据量不大,利用insert, select将数据移到临时表中比直接在大表上做统计要效率更高。
选择更合适的表类型
1、如果应用出现比较严重的锁冲突,请考虑是否更改存储引擎到innodb,行锁机制可以有效的减少锁冲突的出现。
2、如果应用查询操作很多,且对事务完整性要求不严格,则可以考虑使用Myisam存储引擎。
表需要使用何种数据类型,是需要根据应用来判断的。虽然应用设计的时候需要考虑字段的长度留有一定的冗余,但是不推荐让很多字段都留有大量的冗余,这样即浪费存储也浪费内存。
我们可以使用PROCEDURE ANALYSE()对当前已有应用的表类型的判断,该函数可以对数据表中的列的数据类型提出优化建议,可以根据应用的实际情况酌情考虑是否实施优化。语法:
SELECT * FROM tbl_name PROCEDURE ANALYSE();
SELECT * FROM tbl_name PROCEDURE ANALYSE(16,256);
输出的每一列信息都会对数据表中的列的数据类型提出优化建议。第二个例子告诉PROCEDURE ANALYSE()不要为那些包含的值多于16个或者256字节的ENUM类型提出建议。如果没有这样的限制,输出信息可能很长;ENUM定义通常很难阅读。
在对字段类型进行优化时,可以根据统计信息并结合应用的实际情况对其进行优化。
通过拆分,提高表的访问效率
这里我们所说的拆分,主要是针对Myisam类型的表,拆分的方法可以分成两种情况:
1) 纵向拆分:
纵向拆分是只按照应用访问的频度,将表中经常访问的字段和不经常访问的字段拆分成两个表,经常访问的字段尽量是定长的,这样可以有效的提高表的查询和更新的效率。
2) 横向拆分:
横向拆分是指按照应用的情况,有目的的将数据横向拆分成几个表或者通过分区分到多个分区中,这样可以有效的避免Myisam表的读取和更新导致的锁问题。
逆规范化
数据库德规范化设计强调数据的独立性,数据应该尽可能少地冗余,因为存在过多的冗余数据,这就意味着要占用了更多的物理空间,同时也对数据的维护和一致性检查带来了问题。
但是对于查询操作很多的应用,一次查询可能需要访问多表进行,如果通过冗余纪录在相同表中,更新的代价增加不多,但是查询操作效率可以有明显提高,这种情况就可以考虑通过冗余数据来提高效率。
使用冗余统计表
使用create temporary table语法,它是基于session的表,表的数据保存在内存里面,当session断掉后,表自然消除。
对于大表的统计分析,如果统计的数据量不大,利用insert, select将数据移到临时表中比直接在大表上做统计要效率更高。
选择更合适的表类型
1、如果应用出现比较严重的锁冲突,请考虑是否更改存储引擎到innodb,行锁机制可以有效的减少锁冲突的出现。
2、如果应用查询操作很多,且对事务完整性要求不严格,则可以考虑使用Myisam存储引擎。
相关文章推荐
- MySQL查询优化--数据类型与效率
- mysql数据结构优化,范式和反范式
- Java向mysql中插入数据优化问题
- mysql:21个性能优化最佳实践之3[当只要一行数据时使用 LIMIT 1]
- MySQL单表百万数据记录分页性能优化技巧
- MySQL单表百万数据记录分页性能优化
- Mysql单表千万级数据查询优化
- mysql优化----大数据下的分页,延迟关联,索引与排序的关系,重复索引与冗余索引,索引碎片与维护
- MySQL单表百万数据记录分页性能优化
- 提高mysql千万级大数据SQL查询优化30条经验(Mysql索引优化注意)
- MySQL查询优化系列之数据类型与效率
- mysql 联表查询 100w+数据优化
- Mysql 千万级数据分页优化
- MySql Innodb引擎 数据表 上万条数据连续插入优化
- MySQL innoDB数据插入性能优化
- 10分钟掌握数据类型、索引、查询的MySQL优化技巧 - SQL优化
- MySQL的基本数据类型与数据类型优化
- Mysql 批量写入数据 性能优化
- 如何优化Mysql千万级快速分页,limit优化快速分页,MySQL处理千万级数据查询的优化方案!(zz)
- 并发链接,大批量写入数据的mysql插入优化