Mysql优化

Posted wangyi429111

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Mysql优化相关的知识,希望对你有一定的参考价值。

mysql优化主要在三个层次上进行:mysql级别,os级别,硬件级别,本文只讨论mysql级别的优化

Mysql级别优化大致分为两类

1.MySQL配置参数进行优化(my.cnf)

MySQL连接数

MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,连接数少的话,在大并发下连接数会不够用,会有很多线程在等待其他连接释放,就可能会导致数据库连接超时或者响应时间过长,所以需要调整最大连接数。

设置mysql的最大连接数,在mysql的配置文件中增加

max_connections = 1000 #mysql的最大连接数,默认如果不写的话是100个

wait_timeout = 10 超时时间

查看当前有多少个连接

show status like \'%Threads_connected%\';

show processlist;

查看当前被使用的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语句
⑭ 越小的列会越快
⑮ 选择正确的存储引擎
⑯ 小心 "永久链接"

MySQL缓存

查询缓存 MySQL层)Query Cache

Mysql没有shared_pool缓存执行计划,但是提供了query cache缓存sql执行结果和文本,如果在生命周期内完全相同的sql再次运行,则连sql解析都免去了;

所谓完全相同,包含如下条件

Sql的大小写必须完全一样;

发起sql的客户端必须使用同样的字符集和通信协议;

sql查询同一数据库下的同一个表(不同数据库可能有同名表);

Sql查询结果必须确定,即不能带有now()等函数;

当查询表发生DML或DDL,其缓存即失效;

针对mysql/information_schema/performance_schema的查询不缓存;

使用临时表的sql也不能缓存;

 

MySQL查询缓存可以改善性能,但是在使用的时候也有一些问题需要注意:

开启查询缓存对于读写都增加了额外的开销。对于读,在查询开始前需要先检查缓存;对于写,在写入后需要更新缓存。

一般情况这些开销相对较小,所以查询缓存一般还是有好处的。但也要根据业务特征权衡是否需要开启查询缓存。

 

查询缓存参数

mysql配置文件中添加,linux下为my.cnf,windows下为my.ini:

   query_cache_type = on #是否开启查询缓存,具体选项是off,on

   query_cache_size = 200M #分配给查询缓存的总内存,一般建议不超过256M

   query_cache_limit = 1M #这个选项限制了MySQL存储的最大结果。

                                 如果查询的结果比这个大,    那么就不会被缓存。

 

查询qcache状态:

SHOW VARIABLES LIKE \'%query_cache%\';

  • 命令参数列表

– have_query_cache 该MySQL 是否支持Query Cache;

– query_cache_limit  缓存块大小,超过该大小不会被缓存

– query_cache_min_res_unit 每个qcache最小的缓存空间大小

– query_cache_size 分配给查询缓存的总内存

– query_cache_type 是否开启

               query_cache_wlock_invalidate 控制当有锁加在表上的时候,

                                            是否先让该表相关的 Query Cache失效

查询qcache当前使用情况:

SHOW STATUS LIKE \'Qcache%\';

命令参数列表

 Qcache_free_blocks  Query Cache中目前还有多少剩余的blocks。如果该值显示较大,则说明Query  Cache 中的内存碎片较多了,可能需要寻找合适的机会进行整理。如果这个值非常大,可以使用FLUSH QUERY CACHE;语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。Qcache_free_memory  Query Cache 中目前剩余的内存大小

Qcache_hits  缓存命中次数

Qcache_inserts 多少次未命中然后插入

Query Cache 命中率= Qcache_hits / ( Qcache_hits + Qcache_inserts );

Qcache_lowmem_prunes 多少条Query 因为内存不足而被清除出Query

Qcache_not_cached   因为query_cache_type 的设置或者不能被cache 的Query 的数量Qcache_queries_in_cache  当前Query Cache 中cache 的Query 数量;

Qcache_total_blocks 当前Query Cache 中的block 数量

 

查询缓存问题分析:

 

 

总结:

  1. qcache设置的大小
  2. qcache命中率
  3. 怎么开启qcache
  4. 什么时候把数据写到qcache
  5. qcache缓存是sql以及sql的对应的结果集
  6. sql必须得一模一样才能走qcache

 

存储引擎层:InnoDB_Buffer_Pool

buffer pool是innodb存储引擎带的一个缓存池,查询数据的时候,它首先会从内存中查询,如果内存中存在的话,直接返回,从而提高查询响应时间。innodb buffer pool和qcache的区别是:qcacche缓存的是sql语句对应的结果集,buffer pool中缓存的是表中的数据。Buffer pool是设置的越大越好,一般设置为服务器物理内存的70%。

 

Innodb_buffer_pool参数:

Innodb_buffer_pool_size :Innodb_buffer_pool的大小

Innodb_buffer_pool_dump_now:默认为关闭OFF。如果开启该参数,停止MySQL服务时,InnoDB将InnoDB缓冲池中的热数据保存到本地硬盘。

Innodb_buffer_pool_load_at_startup:默认为关闭OFF。如果开启该参数,启动MySQL服务时,MySQL将本地热数据加载到InnoDB缓冲池中。

查询Innodb_buffer_pool状态:

SHOW VARIABLES LIKE \'%innodb_buffer_pool%\';

命令参数列表

innodb_buffer_pool_size 设置的bp大小

     innodb_buffer_pool_filename  热数据文件名称

     innodb_buffer_pool_dump_at_shutdown 停止mysq服务时是否自动保存热数据

     innodb_buffer_pool_dump_now 启动mysql服务时是否自动读取热数据

查询Innodb_buffer_pool当前使用情况:

SHOW STATUS LIKE \'%Innodb_buffer_pool%\';

命令参数列表

主要关注的两个参数

 Innodb_buffer_pool_read_requests 总共查询bp的次数

 Innodb_buffer_pool_reads 从物理磁盘中获取到数据的次数

通过这两个参数我们可以知道bp的命中率

 

explain

inner join 和 left join 差不多,都需要优化右表。而 right join 需要优化左表。

2.对SQL语句以及表优化

 

 

以上是关于Mysql优化的主要内容,如果未能解决你的问题,请参考以下文章

mysql 优化包括哪些内容?

Mysql的性能优化

Mysql的性能优化

mysql 子查询 优化

MySQL Optimization

MySQL优化MySQL 高并发配置优化基础知识