如何优化数据库
1.优化sql语句,优化索引,优化慢查询语句
2.按照范式设计数据库
3.通过redis缓存来缓解数据库压力 请提前将热点数据查出来放到缓存中
4.适当的分库分表,使磁盘的读写效率更高
5.主从方式 ,读写分离。
如何优化sql语句
需要大写列就使用那些列 尽量选用较小的列
select经常使用的字段创建索引
select不要用*
避免在索引列进行操作
一行数据使用limit 1
保证数据不超过200w数据 适当分表
避免改变索引类型
ACID是靠什么保证的
A:原子性。靠日志的回滚来保证,要么都成功,要的都失败回滚
C:一致性,靠原子性,隔离,持久,这三个性质来保证
I:隔离性,事物之间不会相互打扰,由mvcc来保证
D:持久性 也是由日志保证 保证数据能够永久保存成功
mysql的隔离界别
读未提交:a事务读到了 b事务还未提交的数据 脏读,幻读,不可重复读
读已提交:读到了其他事务已经提交的数据 不可重复读,幻读
可重复读:保证同一事物的多次操作读到的数据是一样的 幻读
串行化:一个一个执行,效率低
聚簇索引和非聚簇索引
聚簇索引是索引和数据存在一起,找到索引就找到了数据(innodb)
非聚簇索引索引和数据是分开存的(myisam)
索引的类型
普通索引:最基本的索引,可重复,可空
唯一索引:与普通索引相似,索引列的值必须唯一,可空
主键索引:特殊的唯一索引,一个表只有一个主键,不可空
组合索引:在多个字段上建立索引(越少越好),查询条件使用了第一个索引时才会被使用,遵循最左前缀原则
全文索引:查找全文中的关键字 类似搜索引擎
最左前缀原则
先看第一列,满足条件再看下一列
例如abc 先根据a排序,再根据b排序,再是c排序
索引的存储结构
b+树(innodb) 有序
hash索引(mamery) 将键值转换为哈希值 直接定位 范围查询存在问题
索引失效的情况
- like以%开头
- or的前后没有同时都使用索引 失效
- 组合索引没使用第一个索引列 失效
- 数据出现了隐式转换 失效 varchar不加‘ ’转换为int
- 索引列进行了操作 计算 not in 《 》
索引的缺点
- 占用磁盘空间
- 修改数据的时候 索引也要跟着维护
分库分表的方式
垂直分表:访问多,大字段进行分表
垂直分库:按表耦合度进行分库
水平分表:按数据行分
水平分库:每个库只有表的不问数据 提升效率
- 尽量不要切分
- 数据量过大,影响访问 进行切分
- 数据量快速增长