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