1、什么是主从复制
- master将改变记录到二进制日志(binary log),这些记录过程叫二进制日志事件,binary log events.
- slave将master的二进制日志事件拷贝到它的中继日志(relay log)
slave重做中继日志的事件,将改变应用到自己的数据库,mysql复制是异步的且串行化的
2、数据库优化
数据库性能下降的原因
- 查询数据过多
- 关联了太多表,join
- 没有用到索引或索引失效
- 服务器调优及各个参数设置(线程数,缓冲等)
- 表的设计
- 字段宽度尽可能小
- 尽量把字段设置为NOTNULL
- 用join代替子查询,避免创建临时表完成多余的操作
- 尽量使用数字型字段,若只含数值信息的字段尽量不要设计为字符型,这会降低查询和连接的性能,并会增加存储开销
- 用具体的字段列表代替“*”,不要返回用不到的任何字段
- 事物
- 尽量避免大事务操作,提高系统并发能力
- 锁
- 外键,维护数据的完整性
- 索引
- 优势
- 类似大学图书馆建书目索引,提高数据检索的效率,降低数据库的IO成本
- 通过索引列对数据进行排序,降低数据排序的成本,降低了CPU的消耗
- 劣势
- 实际上索引也是一张表,该表保存了主键与索引字段,并指向实体表的记录,所以索引列也是要占用空间的
- 虽然索引大大提高了查询速度,同时却会降低更新表的速度,如对表进行INSERT、UPDATE和DELETE。因为更新表时,MySQL不仅要保存数据,还要保存一下索引文件每次更新添加了索引列的字段,都会调整因为更新所带来的键值变化后的索引信息
- 优势
- 优化查询语句
- 主从复制
-
3、索引失效的场景
where 子句中对字段进行 null 值判断,尽可能的使用 NOT NULL填充数据库.
- 在 where 子句中使用 != 或 <> 操作符
- 使用 or 来连接条件,如果一个字段有索引,一个字段没有索引,
- in 和 not in 也要慎用,用 exists 代替 in 是一个好的选择
- where子句中对字段进行函数操作
一个表的索引数最好不要超过6个,若太多则应考虑一些不常使用到的列上建的索引是否有必要。
4、索引的数据结构
5、MySQL的存储引擎
InnoDB
- 优点
- 它遵循ACID模式设计,具有与事务(Transactions)、回滚和保护用户数据的崩溃恢复
- InnoDB引擎在主内存中维护了一个buffer pool,用来缓存表和索引,频繁访问的数据会直接在内存中操作。
- 设计表时为每个表添加了主键,会自动优化涉及列的操作。也就是说基于主键的查询、排序、聚合性能会很高。
- 缺点
- 空间使用高,内存使用高,批量插入速度慢;
- 优点
- myisam
6、MySQL事物的四大特性
事务:把一组密不可分的操作系列集合在一起,这些操作要么全部执行,要么全部不执行。
1.原子性:事务是内定义的操作是一个整体,是不可分割的。
2.一致性:同一个事务,多次读取数据库中的同一个数据,读取的内容应该是一致的,不变的。
3.隔离性:不同事务之间相互独立,互不干扰。
4.持久性:事务提交后,事务内的操作对数据库的修改被永久保存在数据库文件中。
7、如何优化慢SQL
参考:https://mp.weixin.qq.com/s/kOIti1ZHdHOb1Yv-OZNROg
8、查询优化原理分析
参考:https://mp.weixin.qq.com/s?__biz=MzI2NTAzNzgxNw==&mid=2247535152&idx=1&sn=9f486ce3cb21a780d4ec6caa9629a3c2&chksm=eaa178a6ddd6f1b0b6c6f1039602e25f362b7c83830ea6a1ef46920eb3fe5f054b792379f1a3&scene=21#wechat_redirect
