在面试以及实际工作中必不可少的话题。mysql优化是一项综合性的过程,并不是优化一种性能就能提高很多,基本是这里优化一些,那里优化一些。性能就提起来了。个人理解,勿喷
优化的方面可以从以下方面着手;
a.表的设计,sql语句,满足三范式,一般不满足三范式的数据库不能叫做关系型数据库
三范式:
1NF:字段不可分;
2NF:有主键,非主键字段依赖主键;
3NF:非主键字段不能相互依赖;
解释:
1NF:原子性 字段不可再分,否则就不是关系数据库;
2NF:唯一性 一个表只说明一个事物;
3NF:每列都与主键有直接关系,不存在传递依赖;
1NF是关系型数据库中的最基本要求,就是要求记录的属性是原子性,不可分,就是属性不能分,这是关系型数据库的基本 要求,不满足这个就不能叫关系型数据库了
2NF是不能有部分依赖,部分依赖的前提条件是有组合主键,就是每条记录是需要一个主键的,这个主键可以是一个单独的属性,但也可以是组合主键,就是由记录的多个属性来唯一确定一条记录,那么只要出现了组合主键就可以产生部分依赖,部分依赖是组合主键出现的前提下,剩余的属性,不完全依赖于组合主键,也是部分依赖组合主键,比如该表的N条记录中由组合主键中的一条或者几条就可以确定剩余属性的属性,那么就可以说产生部分依赖,而在实际开发中,一般不采用组合主键,而是自己增加一个字段id自增长,作为主键,这样的单属性主键是不会产生部分依赖的!
3NF的理解:不能出现传递依赖:就是主键,非主键1,非主键2三者之间不能出现传递依赖关系,如果出现由主键可以推出非主键1,然后由非主键1可以推出非主键2,那么主键与非主键2就产生了传递依赖关系,这就不满足三范式,通俗来讲,在 一个表的,当然以一条记录为单位,主键和非主键之间可以产生父子关系,但是非主键之间是不能出现父子关系 的
b.索引
索引又分多钟索引,普通索引、全文索引、唯一索引、主键索引(效率最快)、还有很多人口中所说的复合索引
c.分表(水平分割、垂直分割)
d.读写分离(多个mysql用来读,即查询等),少数mysql用来写(update/delete/add)
e.存储过程其实也可以列为mysql性能优化之一,都知道mysql数据库其实就是一个文件系统,里面还有dbms(数据库管理系统),在一条sql执行的时候其实是要通过dbms进行编译的,而这个编译是很费时间的,dbms从mysql数据库取数据的,那我们就可以在需要常用的大数据量下sql下预先在mysql的dbms编译好,在第一次查询的时候也会把数据缓存起来的,所以我们在第二次操作的时候会比第一次要快的。这就是存储过程
f.对mysql本身配置优化,比如并发数(一般网站在1000左右等)mysql缓存大小等以适当提高速度,但并不是越大就越好,根据硬件配置来适配,毕竟像并发数等这些东西也是需要线程进程维护的,吃内存等,mysql配置太高,反而容易导致性能降低
g.除了以上的,也可以对服务器硬件的配置进行提升,上诉的优化做得很好,硬件配置太低还是不能太大的提高mysql的性能
以上就是个人理解以及认为可以对mysql优化着手的几个方面,后面会着重介绍其中比较重要的一些优化手段