一。数据库设计方面
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触发器 一般用于 表备份 如果一张表 发生修改 同时将修改的内容同步到 另外一张表中