mysql的优化
可以从三个大的方面来入手mysql级别,os级别,硬件级别
mysql级别
1)正确设定表的属性:字段类型,
2)频繁更新的表用小表;
3)选择合适的引擎
myisam:不支持事务,读性能处理快
Innodb支持事务处理,设计目标是为处理大容量数据发挥最大的性能
4)合适的锁机制:
表锁:开销小,加锁块,并发度低
行锁:开销大,加锁慢,并发度高
页锁:会出现死锁
5)sql语句的优化
字段类型尽量用int或tinyint,另外varchar字段尽量用’’取代null
select * 尽量少用,你想要什么字段就select什么字段不要老是*,同理,只要一行数据时尽量使用limit 1
尽量避免使用order by rand(),因为这个可能会导致mysql的灾难
每个表应该设置一个ID主健,最好为int类型
对于写,尽量用简单的sql,严谨批量insert,update
尽量用exists取代in ,用join取代子查询
数据库架扩展:
主要思想是分解单台数据库负载,突破磁盘I/O性能,热数据存放在缓存中,降低磁盘I/O访问频率
1)读写分离:
部署一主多从架构,主数据负责写操作,并做双机热备,多台从数据库做负载均衡。
读写分离可以通过代理程序来实现.mysql proxy,
如果单台写性能达不到业务要求,可以做从双主,可能会导致数据库数据发生冲突,原因是用户可能操作两台数据库,同时的更新操作导致数据发生冲突。解决:有一套基于perl语言开发的主从复制管理工具叫MYSQL-MMM,这个工具的最大优点是同一时间只提供一台数据库写操作,有效保证数据一致性
2)增加缓存memcached,.redis。
操作系统的优化
1)合适的CPU(选择多核,超线程,更块)
2)合适大小的物理内存(各种缓存,缓冲都要用到内存)
3)合适的网络设备(更快的网络连接)
内核优化
Net_.ipv4.tcp_fin_timeout=30 #TIME_WAIT超时时间,默认为60s
Net.ipv4.tcp_tw_reuse=1 #1表示开启复用,允许TIME_WAIT重新用于新的TCP连接,0表示关闭
Net.ipv4.tcp_tw_recycle=1 #1表示开始TIME_WAIT socket快速回收,0表示关闭
Net.ipv4.tcp_max_syn_backlog=4096#进入SYN队列的最大长度,加大队列长度可容纳更多段等待连接
硬件方面
加大物理内存,提高文件系统性能。Linux内核会从内存中分配出缓存区来存放热数据,通过文件系统延迟写入机制,等满足条件时(如缓存区大小到达一定百分比或者执行sync命令)才会同步到磁盘,也就是说物理内存越大,分配的换存取越大,缓存数据越多
SSD硬盘代替SAS硬盘,将RAID级别调整为RAID1+0.毕竟数据库的压力主要来自磁盘的I/0