使用连接池:对于访问数据库来说,建立连接的代价是较高的,使用连接池可以提高访问性能。
减少对mysql的访问
负载均衡,将请求分布到多台机器上,降低单台服务器的压力。
开启Mysql的查询缓存,当执行完全相同的SQL语句的时候,服务器就会直接从缓存中读取结果,当数据被修改,之前的缓存会失效,修改比较频繁的表不适合做查询缓存。
查询缓存参数配置(mysql8 已经弃用查询缓存,查询缓存有弊端,如果数据库数据更新非常少可以用)
##mysql8 不用做下面的操作。
#查看当前的Mysql数据库是否支持查询缓存;
SHOW VARIABLES LIKE 'have_query_cache';
#查看mysql数据库是否支持查询缓存
mysql> show variables like 'have_query_cache';
+------------------+-------+
| Variable_name | Value |
+------------------+-------+
| have_query_cache | NO |
+------------------+-------+
##查看mysql是否开启了查询缓存
mysql> show variables like 'query_cache_type';
#查看查询缓存的占用大小
mysql> show variables like 'query_cache_size';
#查看查询缓存的状态变量
mysql> show status like 'Qcache%';
开启查询缓存
内存优化原则
myisam存储引擎使用key_buffer缓存索引块,加速myisam索引的读写速度。对于mysiam表的数据块,myisam没有特别的缓存机制,完全依赖操作系统io缓存。
key_buffer_size:决定MyISAM索引块缓存区的大小,直接影响MyISAM表的存取效率,可以在mysql参数文件中设置key_buffer_size的值,对于一般MyISAM数据库,建议指导将1/4可用内存分配给key_buffer_size.
在/etc/my.cnf中:
key_buffer_size=512M
查看大小
#单位字节
mysql> show variables like 'key_buffer_size';
+-----------------+---------+
| Variable_name | Value |
+-----------------+---------+
| key_buffer_size | 8388608 |
+-----------------+---------+
mysql> show variables like 'read_buffer_size';
+------------------+--------+
| Variable_name | Value |
+------------------+--------+
| read_buffer_size | 131072 |
+------------------+--------+
1 row in set (0.00 sec)
mysql> show variables like 'read_rnd_buffer_size';
+----------------------+--------+
| Variable_name | Value |
+----------------------+--------+
| read_rnd_buffer_size | 262144 |
+----------------------+--------+
read_buffer_size: 如果需要经常顺序扫描myisam表,可以通过增大read_buffer_size的值来改善性能。但需要注意的是read_buffer_size是每个session独占的,如果默认值太大,会造成内存浪费。
read_rnd_buffer_size: 对于需要做排序的myisam表做查询,如果带有order by字句的sql,适当增加read_rnd_buffer_size的值,可以改善此类的sql性能,但需要注意的是read_rnd_buffer_size是内个session独占的,如果默认值设置太大,就会造成内存浪费。
innodb用一块内存区做IO缓存池,该缓存池不仅用来缓存innodb的索引块,而且也用来缓存innodb的数据块
innodb_buffer_pool_size
该变量界定了innodb存储引擎表数据和索引数据的最大缓存区大小。在保证操作系统和其他程序内存可用的情况下,innodb_buffer_pool_size的值越大越好,缓存命中率越高,访问Innodb表需要的磁盘i/o就越少,性能越高。
innodb_buffer_pool_size=512M
innodb_log_buffer_size
决定了innodb重做日志缓存的大小,对于可能产生大量更新记录的大事务,增加innodb_log_buffer_size的大小,可以避免innodb在事务提交前就执行不必要的日志写入磁盘操作。
innodb_log_buffer_size=10M
查看参数:
mysql> show variables like 'innodb_buffer_pool_size';
+-------------------------+-----------+
| Variable_name | Value |
+-------------------------+-----------+
| innodb_buffer_pool_size | 134217728 |
+-------------------------+-----------+
1 row in set (0.00 sec)
mysql> show variables like 'innodb_log_buffer_size';
+------------------------+----------+
| Variable_name | Value |
+------------------------+----------+
| innodb_log_buffer_size | 16777216 |
+------------------------+----------+