mysql的优化总结

一。数据库设计方面

1)遵循数据库设计三大范式 ,适当的进行反范式设计

第一范式:1NF 原子性 字段不能再拆分

第二范式: 2NF 先满足第一范式 主键之外的要完全依赖于主键,消除了部分依赖

第三范式 :3NF 先满足第二范式 完全消除传递依赖

反范式设计:允许部分冗余字段,目的为了避免多表查询,提高查询速度

优点:查询速度快      缺点:冗余字段多维护起来成本高

范式优点:方便维护    缺点:查询速度不如反范式

2)设计字段的时候尽可能使用小的字段,比如varchar  tinyint

3)选择合适的mysql引擎  两个引擎的区别(重点)

1>存储类型的区别 myisam frm 表结构文件 myd数据文件 myi索引文件      innodb  frm  ibd 数据索引共用一个表空间

2>myisam读的效率高,不支持事务  表锁    innodb支持事务  支持行锁

一般数据是插入和查询使用myisam引擎 ,删除和修改使用innodb引擎

3>mysql5.5以后默认引擎是innodb

4>mysql5.7以后innodb支持全文索引   之前版本不支持

事务:(acid特性)

原子性  一致性  隔离性  持久性

四个隔离级别:读未提交(脏读)     读提交(不可重复读)   重复读(幻读)   序列化(解决幻读  脏读 不可重复读 但是消耗比较大,一般不用)

4)数据表 可以加数据库名为前缀  我们的字段可以加数据表名为前缀,字段起名要有意义,可以使用简称

二。sql语句的优化

1)可以适当的添加索引 但是要注意引起索引失效的几种情况

1>like条件 模糊查询 两个%会导致索引失效

解决方法:只要保证左边没有%号即可

2>索引字段不要使用运算及函数

3>设计表字段的时候  类型是字符串  走索引      如果是int类型   不走索引

4>最左原则 查询过程中条件必须包含最左的一个,否则索引失效

5>避免使用or 否则索引失效

2)开启慢查询

我们不断的在执行sql语句  记录下查询时间超过2秒或者指定时间的sql语句  将这些sql语句写入日志  接下来我们对日志文件中的sql语句  进行 explain 或者 desc分析

slow_query_log=on                开启慢查询

slow_query_log_file=slow.log    查询超过2秒的sql语句  记录到这里

long_query_time=1                记录查询超过1秒的sql语句

log_queries_not_using_indexes     记录查询没有使用到索引的sql语句

3)2000条数据是个界限  2000条范围之内  不用添加索引

4)如果数据量大,不要在sql语句上进行复杂的逻辑运算,避免使用视图 触发器 存储

5)多表联合查询  尽量避免嵌套查询  in   尽量使用inner join  左连接  右链接

三。架构方面的优化(了解知道)

1>采用分布式 读写分离

2>大表可以 使用 分库分表 (横向分表 纵向分表)

3>mysql分区  物理形态上分成五个分区 对于用户来讲 还是当成一张表来对待 再创建表的时候进行分区

4>大型的数据采用数据库中间件  帮你解决数据库数据导入备份  分表分区监控

东方通   360  百度

5>使用redis 进行数据库的缓存  减轻mysql 的压力   提高查询的速度

四。硬件方面的优化

1>使用固态硬盘

2>增加带宽

3>增加内存

4>扩充 数据库服务器的数量

补充说明:*视图 也叫临时表  把经常通过where条件查询的数据放到临时表中 下次 直接从临时表读取 避免过多的损耗数据库

*mysql 存储 存储代码段 经常用它 批量插入数据

mysql触发器 一般用于 表备份  如果一张表 发生修改  同时将修改的内容同步到 另外一张表中 

 

 
 
 
原文地址:https://www.cnblogs.com/aibabel/p/11710555.html