数据库优化
- 思路:先优化查询语句,再备份后修改
- ACID: 原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。一个支持事务(Transaction)的数据库,必须要具有这四种特性
1.查询时候尽量不使用*
2.查询并添加索引/外键(在navcate中直接添加查询语句的条件项)
例:select * from table where age>18 and sex="男"
给age和sex加外键,优先检索前面的age【二叉树最小值】
3.设计合理的sql查询条件,根据实际情况使用and
4.使用‘or’进行查询时候尽量不要使用“or”,尽量使用“union all”
注:一旦用or就不走索引了,union all 是走索引,先一个表单独查,再做并集
5.使用like模糊查询(语句中有%)
尽量不要在需要查询的关键字之前加%,因为这样就不走索引了
6.使用count时,效率最低到高的顺序是 count(字段名) <count(*)<count(1)
7.除了count、average等尽量不要用sql自带的函数
因为:自带的函数不走索引
8.使用sql语句优化工具:exlain/desc【一组命令工具,得查下具体用法】
用法:exlain 正常sql语句
9.数据库设计原则
9.1尽量遵循三大范式
字段类型
varchar(长度+1)
用户名
描述
邮箱
手机号
char
手机号
密码
int
性别(int/tinyint) 数字比字符查询速度快
9.2所有字段尽量设计成NotNull
9.3表引擎尽量用Innodb
Innodb支持事务,MyIsam不支持
Innodb是行锁,MyIsam是表锁 锁是防止多个sql语相互冲突
Innodb不支持全文检索,MyIsam支持全文检索
10.对于查询频率很高的操作尽量使用MemCache(第三方的数据库缓存工具)和redis(内存数据库,非关系型数据库,自带去重)
MemCache 适合不太频繁改变sql语句的查询,位于应用与数据库之间
频繁写入的数据库不适合用关系型数据库,适合用redis - 例:购物车功能、浏览次数统计;注:通常redis和mysql一起使用,redis负责频繁读写的功能
11.分表(最后再考虑这个,需要修改对应的查询语句)
按列分 - 分离数据项
按行分 - 逻辑分区
12.多个库,读写分离
主从设置
13.mysql配置
14.硬件配置
cpu使用率、应用程序所占进程、mysql进程
15:其他
- 当数据太多时候不要在高峰期添加索引,索引是将字段加到一张索引表,对导致短暂卡顿
- 时间戳现在是10位或13位(带毫秒),到2030年失效
- 业务逻辑尽量不要给数据库处理,在程序中处理,逻辑单边化独立化