## 1、数据库优化的目的
**避免出现页面访问错误**
* 由于数据库连接timeout产生页面5XX错误
* 由于慢查询造成页面无法加载
* 由于阻塞造成数据无法提交
**增加数据库稳定性**
* 很多数据库问题都是由于低效的查询引起的
**优化用户体验**
* 流畅页面的访问速度
* 良好的网站功能体验
## 2、可以从几个方面进行数据库优化
![](/assets/TIM图片20171222211122.png)
在这个金字塔结构中`SQL及索引`优化占最大的面积而且同时也是金字塔的基础,对于优化来说,`SQL及索引`优化是最重要的。
**SQL及索引**
`在这一步需要做什么那?`
* 根据需求写出一个结构良好的SQL
* 根据这个SQL在表中建立一些**有效**的索引.
* 索引太多,不但影响写入时的效率,对于查询时的效率也是会有影响的。
* 索引一定要适量,一定要有效。
**数据库表结构**
* 如果表结构设计的不合理,就很难写出一个结构良好的SQL,也很难对SQL进行优化。所以SQL及索引的优化是表结构的设计。
* 要根据数据库范式的要求来进行简洁明了的设计,尽量减少冗余。
* 要思考怎么样的表结构有利于SQL的查询
**系统配置**
* 系统本身也有一些限制如:
* TCP/IP连接数的限制
* 打开文件数的限制,最重要的。MYSQL是基于文件的,每查询一些表都要打开一些文件,如果文件数达到了一定限制,这个文件就无法打开,就会进行频繁的I/O操作。
* 安全性的限制
**硬件优化**
* 更适合数据库的CPU
* CPU越多并不一定会对数据库有更好的影响,MySQL会对CPU核数有一个限制,并不会用到太多的核数,有的查询只能用到单核。
* 更快的I/O
* 并不能减少数据库锁的机制,因为锁是数据库内部保持数据完整性的机制,所以说I/O很快,并不能减少数据库的阻塞。
* 更多的内存
* 数据库的数据是先装在内存中,然后在进行查询修改的。内存越大对数据库的性能就越好。
如果SQL和索引没有优化好,数据库查询产生慢查询或者产生大量阻塞,这种情况是由于MySQL内部的一些锁机制造成的,所以再好的硬件也是没有办法对这些进行优化。一旦慢查询很多阻塞很多,那么并发量就会上去。并发量上去,再好的硬件\*\*也会很高,造成应用响应缓慢。