选择合适的数据库引擎
Myisam存储引擎:如果表对事物要求不高,同时是以查询和添加为主的,我们考虑使用myisam存储引擎,比如论坛中的发帖表,回复表
Innodb存储引擎:对事物要求高,保存的数据都是重要数据.我们建议使用innodb,比如订单表,账号表
Myisam和innodb的区别:
1. 事务安全,myisam不支持使用,而innodb支持
2. 查询和添加速度,myisam不用支持事务就不用考虑同步锁,查找和添加的速度快
3. 支持全文索引,myisam支持,innodb不支持
4. 锁机制:myisam支持表锁,innodb支持行锁
5. 外键:myisam不支持外键,innodb支持外键
选择合适的索引
索引是帮助DBMS高效获取数据的数据结构.
分类:普通索引,唯一索引,主键索引,全文索引
1.普通索引:允许重复的值出现
2.唯一索引:除了不能有重复的记录外,其它和普通索引一样.(用户名;用户身份证;手机号)
3.主键索引:是随着设定主键而创建的;也就是把某个列设为主键的时候,数据库就会给该列创建索引;唯一且没有null值
4.全文索引:用来对表中文本域(char,varchar,text)进行索引,全文索引针对myisam
.使用索引的一些技巧
索引弊端:
1. 占用磁盘空间.
2. 对dml(插入,修改.删除)操作有影响,变慢
使用场景:
1. 肯定在where条件经常使用,如果不做查询就没有意义
2. 该字段的内容不是唯一的几个值(sex).
3. 字段内容不是频繁变化
具体技巧:
1. 对于创建的多列索引(复合索引),不是使用的第一部分就不会使用索引(最左匹配)
2. 对于使用like查询,查询如果是”%aaa”不会使用到索引,而”aaa%”会使用到索引
3. 如果条件中有or,有条件没有使用索引,即使其中有条件带索引,也不会使用.简单来说,就是要求使用的所有字段,都必须单独使用时才能使用索引.
4. 如果列类型是字符串,拿一定要在条件中将数据使用引号引用起来,否则索引失效
5. 如果mysql估计使用全表扫描要比索引快,则不适用索引.例子:表里只有一条记录
数据库优化之分表
分表分为水平分表(按行)和垂直分表(按列)
水平:在实际操作中,mysql表数据一般达到百万级别,查询效率会很低,容易造成表锁,甚至堆积很多连接,直接挂掉.水平分表能够很大程度的减少这些压力.
垂直:如果一张表中某个字段值非常多(长文本,二进制等),而且只有在很少的情况下会查询,比如商品的详情描述,这时候就可以把字段单个放到一个表,通过外键与原表关联起来
水平分表策略:
1. 按时间分表:这种分表方式有一定的局限性,当数据有较强的时效性.如微博发布纪录,微信消息纪录等,这种数据很少会有用户查询几个月前的数据,这时可以按月分表
2. 按区间范围分表:一般在有严格的自增id需求上,如按照user_id水平分表
3. Hash分表(用的多):通过一个原始目标的id或者名称通过一定的hash算法计算出数据库存储表的表名,然后访问相应的表.
数据库的读写分离
一台数据库支持的最大并发连接数是有限的,如果用户并发访问太多,一台服务器满足不了要求时,可以集群处理.mysql的集群处理技术最常用的是读写分离,
1.主从同步:数据库最终会把数据持久化到磁盘,如果集群必须确保每个数据库服务器的数据时一致的.能改变数据库数据的操作都往主数据库去写,而其他的数据库从主数据库上同步数据
2.读写分离:使用负载均衡来实现写的操作都往主数据.而读的操作都往从数据库去
数据库优化之缓存
在持久层(dao)和数据库(db)之间添加一个缓存层,如果用户访问的数据已经缓存起来时,在用户访问数据时从缓存中获取,不用访问数据库,而缓存是在操作内存,访问速度快
作用:减少数据库服务器压力,减少访问时间
SQL语句优化小技巧
DDL优化:
1. 通过禁用索引来提供导入数据性能,这个操作主要针对有数据的表追加数据
2. 关闭唯一校验
3. 修改事务提交方式(导入)(变多次提交为一次)
DML优化: 把多条插入的语句合并为一条(变多次提交为一次)
DQL优化:
Order by 优化
多用索引排序
普通结果排序(非索引排序)
Group by 优化:如果对排序的结果没有排序的需求,可以考虑在其后面加上order by nul
子查询优化
Or优化:
1.or两边都是用索引字段做判读,性能好
2.or两边,有一边不用,性能差
3.如果name=”a” or name=”b”,这种方式,索引失效