mysql 优化主要从以下几个方面来实现:
一、设计角度
1.存储引擎的选择:
常用的主要分为两种,一种是 innodb,一种是 myisam,两者的主要区别是
①myisam 不支持事务处理,而 innoDB 支持事务处理
②myisam 不支持外键,innoDB 支持外键
③myisam 支持全文检索,而 innoDB 在 MySQL5.6 版本之后才支持全文检索
④数据的存储形式不一样,mysiam 表存放在三个文件:结构、索引、数据,innoDB 存储把结构存储为一个文件,索引和数据存储为一个文件
⑤myisam 在查询和增加数据性能更优于 innoDB,innoDB 在批量删除方面性能较高。
⑥myisam 支持表锁,而 innoDB 支持行锁
2.字段类型选择:
选择合理的字段类型,数据类型尽量选择固定长度
不要使用字符串类型存储日期时间数据,避免NUll等。
不要使用字符串类型存储日期时间数据,避免NUll等。
3.范式:
遵循第三范式,但是有时可以适当违反第三范式(3NF),减少join操作。
二、功能角度
可以利用 mysql 自身的特性
如索引,查询缓存,碎片整理,分库、分表等。
可以利用 mysql 自身的特性
如索引,查询缓存,碎片整理,分库、分表等。
1.索引
首先我们得确定哪些 sql 语句需要优化,一般在一个系统中,查询语句最多,所以我们主要是针对查询语句进行优化。主要采用两种方式来确定要优化的 sql 语句:
①使用慢查询日志,设置需要优化的 sql 语句的执行时间,记录下超过该设置时间的语句, 即为需要优化的语句。
①使用慢查询日志,设置需要优化的 sql 语句的执行时间,记录下超过该设置时间的语句, 即为需要优化的语句。
②使用 profiling 机制,记录下每条 sql 语句的执行时间,找出执行较慢的语句,即为需要优化的语句。
我们主要通过给表字段添加索引的方式进行优化,加上索引后,sql 语句的执行时间显著提高了,但并不是加上索引了这条 sql 语句就会用到索引,所以首先看执行慢的语句后面是否有加索引,我们可以使用 explain 或者 desc 加在要执行的 sql 语句前,查看是否使用到索引。
先开启慢查询日志:
set global slow_query_log = on # 开启慢查询日志,默认是关闭的
set global long_qurey_time=0.5 # 设置慢查询时间阈值,单位:秒
再去定位慢查询语句
explain 进行分析,相应字段,查看是否使用到索引
有几个地方需要注意的是:
①为了避免建议索引而造成索引文件过大,我们会使用复合索引,这时候要遵循最左原则。
②like 查询,前%不会用到索引
③如果条件中有 or,则要求 or 的索引字段都必须有索引,否则不能用到索引。
④如果列类型是字符串,一定要在条件中将数据使用引号引用起来,否则不使用索引。
⑤优化 group by 语句
⑥尽量避免模糊匹配,这样会导致全盘扫描
2.分表又分为:水平分表,垂直分表
①对表格进行水平拆分:水平切分是将同一个表中的记录拆分到多个结构相同的表中;
② 对表格进行垂直拆分:
把不常用的字段单独放在一个表中;
常用的字段单独放在一个表中;
一些大字段单独放在一个表中;
② 对表格进行垂直拆分:
把不常用的字段单独放在一个表中;
常用的字段单独放在一个表中;
一些大字段单独放在一个表中;
三、sql 语句的优化方面
1.尽量简化查询语句,能查询字段少就尽量少查询字段,优化分页语句、分组语句等。
2.减少count(*),select * 使用,优化limit m,n分页,以及避免模糊匹配导致全盘扫描
1.尽量简化查询语句,能查询字段少就尽量少查询字段,优化分页语句、分组语句等。
2.减少count(*),select * 使用,优化limit m,n分页,以及避免模糊匹配导致全盘扫描
3.like进行模糊查询,第一个位置不要使用’%‘等等
四、部署大负载架构体系
把数据库服务器单独出来,负载大时可以采用主从复制,读写分离机制进行设计。
把数据库服务器单独出来,负载大时可以采用主从复制,读写分离机制进行设计。
具体不在这里多介绍,可以去查查
五、从硬件上升级数据库服务器
花钱能解决所有问题!!!