MySQL 数据库基础知识点复习


  • redis 或者 memcache 缓存减少数据库压力
  • 数据库安全
    1. 外网不可访问(3306端口)
    2. 禁止弱口令
    3. 用户管理权限,给每个数据库分配单独的账号,甚至根据实际情况,设置账号的可读可写权限
    4. 禁用root权限操作
    5. ip白名单限制其它ip访问
    6. 数据库定时备份
  • 数据库的基本配置
    1. 最大连接数
    2. innodb_lock_wait_timeout 锁超时时间(秒)
    3. tmp_table_size 临时表数量
  • 数据库存储引擎,innodb与myisam 的取舍
  • 三范式,每列的原子性,每行的唯一性,数据的去冗余,以及反三范式
  • 数据库字段类型取舍,sql语句的优化
  • 基本的索引,主键、唯一索引、普通索引、组合索引、最左原则
  • eplain 或者 desc 执行计划,查看并分析具体sql语句中索引的使用情况
  • 设置慢查询参数,开启慢查询日志,分析执行慢的sql语句进行优化
  • profile 查看具体执行时间,找出执行慢的sql语句并进行优化
  • 事务的四大特性:
    1. 原子性,要么一起成功,要么一起回滚
    2. 一致性,事务执行前后,数据都是合法状态
    3. 隔离性,默认隔离级别,可重复读
    4. 永久性,执行成功,则保存到了硬盘中
  • 事务隔离性带来的问题,脏读、不可重复读、幻读
    1. 脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据
    2. 不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。
    3. 幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。
    4. 小结:不可重复读的和幻读很容易混淆,不可重复读侧重于修改,幻读侧重于新增或删除。解决不可重复读的问题只需锁住满足条件的行,解决幻读需要锁表
  • 隔离级别
    1. 读未提交,脏读:是,不可重复读:是,幻读:是
    2. 不可重复读,脏读:否,不可重复读:是,幻读:是
    3. 可重复读,脏读:否,不可重复读:否,幻读:是,mysql默认隔离级别,
    4. 串行化,,脏读:否,不可重复读:否,幻读:否
  • 锁,表锁、行锁、排它锁、意向锁、循环锁(死锁)、读锁(共享锁)、写锁(排它锁),自动提交、手动开启共享锁、手动开启排它锁、等锁概念
  • 查询缓存(查询缓存的弊端),分析查询缓存的使用情况和命中率
  • 对于数据量较大的数据比如数据量超千万,进行逻辑分区,逻辑分区可以根据
    1. list 条件分区,根据“字段的内容值”是否在某个“列表”中进行分区,通过预定义的列表的值来对数据进行分割
    2. range 范围分区,根据“字段内容的值”是否在 某个范围进行分区,通过预定义的范围值来对数据进行分割
    3. hash 哈希分区,只能针对整数进行,允许通过对表的一个或多个列的Hash Key进行计算,最后通过这个Hash码不同数值对应的数据区域进行分区
    4. key 分区,KEY分区支持除text和BLOB之外的所有数据类型的分区
  • 进行物理分表(水平分表),比如用户日志,可以根据每月一张表来进行物理分表,通过应用程序进行控制
  • 进行垂直分表,把冷热字段分开来设计,减少数据库的资源开销
  • 主从复制,读写分离,根据主数据库的二进制日志去同步数据到从数据库。
  • 全文索引,用 sphinx 或者 es 或者 框架自带的全文索引组件