MYSQL优化
MySQL优化一直是个头痛的问题,由于自己刚接触MySQL不久,故把自己的学习过程记录于此。
mysql的优化不是指某个sql的优化,而是多种优化的组合,以下列表列出一般优化的过程。
- 表的设计优化(符合3NF)
- 索引
- sql优化
- 分表技术
- 读写分离
- 存储过程
- mysql配置的优化
- MySQL服务器硬件优化
- 清除不需要数据,定时整理碎片(MyISAM引擎)
表优化
mysql表的优化主要是指标的设计要符合理念;
1、首先表的设计要满足3NF
数据库3NF
第一范式:表的属性具有原子性,不可再分解。即表的列不可再分解。现在的关系型数据库都满足第一范式。
第二范式:表中的记录要唯一,既不能出现完全相同的一行数据,可设计主键来满足第二范式。
第三范式:避免不必要的冗余数据,就是说,表的字段信息,如果能够被推导出来,就不应该单独的设计一个字段来存放.
2、为每个表选择合适的引擎
MySQL支持多种存储引擎,每种都有自己的特色。下列表列出来MySQL的存储引擎;
- MyISAM
- IBMDB2I
- InnoDB
- MEMORY
- MERGE
- FEDERATED
- ARCHIVE
- CSV
- EXAMPLE
- BLACKHOLE
下面就常用的三个引擎做少许说明,
MyISAM
MyISAM引擎是3.23版本后的默认存储引擎,即当你在创建表时若没有指定存储引擎,则默认是myisam引擎的,该引擎的表能存储更多的数据,查询速度快,但无法处理事务等高级特性。
myisam引擎创建的表又分三种格式:静态、动态、压缩;
关于静态MyISAM和动态MyISAM是指当表的任一列都不含varchar,text,blog,xblog,xtext时,MySQL就认为该表是静态的。静态MyISAM类型的表的性能很高,因为在维护和访问以预定义存储的数据时开销很低而且最不可能出现因数据损坏而失败的情况,但缺点是消耗空间资源,每列都需要为该列分配最大空间而不管是否使用。(如某字段类型为char(20), 当该字段只存了 ‘aaaa’ 四个字节时,其依旧占用了20字节的存储空间)。
动态MyISAM:虽然MyISAM动态占用的空间比静态格式的少,但容易参数碎片。如某个字段的内容改变时,则该字段存储在磁盘的位置可能需要移动,这会导致碎片的产生,当碎片过多时就会严重影响性能。这有两种解决方案:
1:尽量使用静态数据类型
2:使用 optimize table 整理表的碎片在整个应用程序生命周期都可读是,就应该把设计为MyISAM压缩格式的,可以用myisampack工具来将其转换为myISAM压缩表以减少占用空间
InnoDB
INnoDB是一个精壮的事务型存储引擎。是以下情况的理想引擎:
- 更新密集的表
- 事务
- 灾难恢复
MEMORY
改引擎的表数据存储在内存中, 速度最快,但当MySQL进程崩溃时,所有的MEMORY数据都会丢失。