目录
一.MySQL数据库优化
- 遵循MySQL层优化的五个原则: 减少数据访问,返回更少的数据,减少交互次数减少服务器CPU开销,利用更多资源。
- 理解SQL优化原理并进行SQL优化,例如避免不走索引的场景,最大化利用索引,尽可能避免全表扫描,减少无效数据的查询等。
- 事务日志性能优化:双一设置是innodb_flush_log_at_trx_commit和sync_binlog两个参数设置,都设置为1就是双1设置。MySQL 默认配置就是双1配置。
- 优化MySQL所在服务器内核。
- 优化数据库参数以提高资源利用率,从而提高MySQL服务器性能。此优化需要进行压力测试来进行参数调整,MySQL服务的配置参数都在my.cnf或myini中,其中一些性能影响较大的参数包括query_cache_size和query_cache_type等
MySQL参数优化
MySQL 默认的最大连接数为 100,可以在 mysql 客户端使用以下命令查看
mysql> show variables like 'max_connections';
查看当前访问Mysql的线程
mysql> show processlist;
设置最大连接数
mysql>set globle max_connections = 5000;
最大可设置16384,超过没用
查看当前被使用的connections
mysql>show globle status like 'max_user_connections'
对MySQL语句性能优化的16条经验
- 为查询缓存优化查询
- EXPLAIN 我们的SELECT查询(可以查看执行的行数)
- 当只要一行数据时使用LIMIT 1
- 为搜索字段建立索引
- 在Join表的时候使用相当类型的列,并将其索引
- 千万不要 ORDER BY RAND ()
- 避免SELECT *
- 永远为每张表设置一个ID
- 可以使用ENUM 而不要VARCHAR
- 尽可能的使用NOT NULL
- 固定长度的表会更快
- 垂直分割
- 拆分打的DELETE或INSERT语句
- 越小的列会越快
- 选择正确的存储引擎
- 小心 "永久链接"
二.Redis优化
1.避免使用命令keys *:这个命令是阻塞的,即操作执行期间,其它任何命令在你的实例中都无法执行。当redis中key数据量小时到无所谓,数据量大就很糟糕了。所以我们应该避免去使用这个命令。可以去使用SCAN,来代替。
2.数据压缩后再存入redis:redis为每种数据类型都提供了两种内部编码方式,在不同的情况下redis会自动调整合适的编码方式。
3.设置key的有效期:我们应该尽可能的利用key有效期。比如一些临时数据(短信校验码),过了有效期Redis就会自动为你清除
4.选择回收策略(maxmemory-policy):当Redis的实例空间被填满了之后,将会尝试回收一部分key。根据你的使用方式,强烈建议使用 volatile-lru(默认) 策略——前提是你对key已经设置了超时。但如果你运行的是一些类似于 cache 的东西,并且没有对 key 设置超时机制,可以考虑使用 allkeys-lru 回收机制,具体讲解查看 。maxmemory-samples 3 是说每次进行淘汰的时候 会随机抽取3个key 从里面淘汰最不经常使用的(默认选项)。
1 2 3 4 5 6 7 |
maxmemory-policy 六种方式 : volatile-lru:只对设置了过期时间的key进行LRU(默认值) allkeys-lru : 是从所有key里 删除 不经常使用的key volatile-random:随机删除即将过期key allkeys-random:随机删除 volatile-ttl : 删除即将过期的 noeviction : 永不过期,返回错误 |
5.使用bit位级别操作和byte字节级别操作来减少不必要的内存使用:
1 2 |
bit位级别操作:GETRANGE, SETRANGE, GETBIT and SETBIT byte字节级别操作:GETRANGE and SETRANGE |
6.当业务场景不需要数据持久化时,关闭所有的持久化方式可以获得最佳的性能:数据持久化时需要在持久化和延迟/性能之间做相应的权衡
7.想要一次添加多条数据的时候可以使用管道
8.限制redis的内存大小:(64位系统不限制内存,32位系统默认最多使用3GB内存)
数据量不可预估,并且内存也有限的话,尽量限制下redis使用的内存大小,这样可以避免redis使用swap分区或者出现OOM错误。(使用swap分区,性能较低,如果限制了内存,当到达指定内存之后就不能添加数据了,否则会报OOM错误。可以设置maxmemory-policy,内存不足时删除数据)
9.尽可能使用哈希存储
10.使用lazy free特性: lazy free是Redis 4.0新增的一个功能,它可以理解为惰性删除或延迟删除。意思是在删除时提供异步延时释放键值的功能,把键值释放操作放在BIO(BackgroundI/0)单独的子线程处理中,以减少删除对Redis主线程的阻塞。
三.MySQL创建测试账号报错
报错信息:
因为数据库版本不一致,在还原过后,忘记升级数据库(还原后没有使用 mysql_upgrade升级数据结构)。其实从错误信息也能看出需要执行 mysql_upgrade命令,检查所有数据库中的所有表与当前版本的 MySQL服务器是否不兼容。 mysql_upgrade还会升级系统表,以便你可以使用一些新特性或功能。
解决方法:
mysql_upgrade -u root -p
随后登入数据库正常创建用户即可