mysql 开发进阶篇系列 23 应用层优化与查询缓存

一.概述    

  前面章节介绍了很多数据库的优化措施,但在实际生产环境中,由于数据库服务器本身的性能局限,就必须要对前台的应用来进行优化,使得前台访问数据库的压力能够减到最小。
  1. 使用连接池
  对于访问数据库来说,建立连接的代价比较昂贵,因为连接到数据库服务器需要经历多个步骤如:建立物理通道,服务器进行初次握手,分析连接字符串信息,由服务器对连接进行身份验证等。因此,有必要建立"连接池"以提高访问的性能。连接池中的连接已经预先创建好了,可以直接分配给应用层使用,减少了创建新连接所消耗的资源,连接返回后,本次访问将连接交还给"连接池",以供新的访问使用。

(1)如果池中有空闲连接可用,返回该连接。
(2)如果池中连接都已用完,创建一个新连接添加到池中。
(3)如果池中连接已达到最大连接数,请求进入等待队列直到有空闲连接可用。

//下面以ado.net 连接数据库为例:
             //引用 System.Data.SqlClient
            //可以使用字符串connectionString来实例化SqlConnection对象
            string connectionString ="Integrated Security=False;server={0};database={1};User ID={2};Password={3};Max Pool Size=512;Connect Timeout=30";

            //也可以使用SqlConnectionStringBuilder类来实例化SqlConnection对象
            SqlConnectionStringBuilder sqlconnStringBuilder = new SqlConnectionStringBuilder();
            //连接池是否默认打开 默认为true
            sqlconnStringBuilder.Pooling = true;
            //连接池中最大连接数
            sqlconnStringBuilder.MaxPoolSize = 512;
            //连接请求等待超时时间。默认为15秒,单位为秒。
            sqlconnStringBuilder.ConnectTimeout = 30;
            sqlconnStringBuilder.DataSource = "";
            sqlconnStringBuilder.UserID = "";
            sqlconnStringBuilder.Password = "";
            //使用用户名和密码连接
            sqlconnStringBuilder.IntegratedSecurity = false;

            SqlConnection sql = new SqlConnection(connectionString);
            //or
            sql = new SqlConnection(sqlconnStringBuilder.ConnectionString);

            //用完后记得关闭当前连接
            sql.Close();

            //使用mysql一样 引用MySql.Data.dll
            MySql.Data.MySqlClient.MySqlConnection mysqlconn = new MySql.Data.MySqlClient.MySqlConnection();
            MySql.Data.MySqlClient.MySqlConnectionStringBuilder mysqlconnStringBuilder = new MySql.Data.MySqlClient.MySqlConnectionStringBuilder();

  2.使用查询缓存
  mysql的查询缓存在4.1版本以后新增的功能,它的作用是存储select 查询的文本以及相应结果。如果随后收到一个相同的查询,服务器会从查询缓存中重新得到查询结果,而不再需要解析和执行查询。查询缓存的适用对象是更新不频繁的表,当表更改(表结构和表数据)后,查询缓存值的相关条目被清空。

--  查询缓存相关的参数
SHOW VARIABLES LIKE ‘%query_cache%‘;

        参数解释:


have_query_cache


表示这个mysql版本是否支持查询缓存。


query_cache_limit


表示单个结果集所被允许缓存的最大值。

1048576.0/1024.0/1024.0=1.0M 默认1M,超过空间大小不被缓存。


query_cache_min_res_unit


每个被缓存的结果集要占用的最小内存。


query_cache_size


用于查询缓存的内存总大小。

1048576.0/1024.0/1024.0=1.0M 默认1M,超过空间大小不被缓存。


query_cache_type


默认关闭缓存


query_cache_wlock_invalidate


控制当有写锁加在表上的时候,是否先让该表相关的 Query Cache失效。

OFF: 是指在锁定时刻仍然允许读取该表相关的 Query Cache。

ON: 写锁定的同时将使该表相关的所有 Query Cache 失效。

-- 监视查询缓存的使用状况
SHOW STATUS LIKE ‘Qcache%‘ 

      参数解释:


Qcache_free_memory  


查询缓存目前剩余空间大小。


Qcache_hits     


查询缓存的命中次数。


Qcache_inserts     


查询缓存插入的次数


Qcache_free_blocks


目前还有多少剩余的blocks。FLUSH QUERY CACHE 会对缓存中的碎片进行整理,从而得到一个空闲块。这个值比较大,意味着内存碎片比较多

Qcache_lowmem_prunes 多少条Query 因为内存不足而被清除出Query Cache。缓存出现内存不足并且必须要进行清理,以便为更多查询提供空间的次数。这个数字最好长时间来看;如果这个数字在不断增长,就表示可能碎片非常严重,或者内存很少。

Qcache_not_cached

不能被cache 的Query 的数量。不适合进行缓存查询的数量,通常是由于这些查询不是 SELECT 语句

Qcache_queries_in_cache

当前Query Cache 中cache 的Query 数量.

Qcache_total_blocks

当前Query Cache 中的block 数量。

  (查询缓存章节未完...)

原文地址:https://www.cnblogs.com/MrHSR/p/9486839.html

时间: 2024-08-28 22:02:24

mysql 开发进阶篇系列 23 应用层优化与查询缓存的相关文章

mysql 开发进阶篇系列 5 SQL 优化

一. 使用sql提示 sql 提示(sql hint)是优化数据库的一个重要手段, 是在sql语句中加入一些人为的提示来达到优化操作的目的. 1.1 use index 在查询语句中表名的后面,添加use index 强制mysql使用该索引,不考虑其它索引. EXPLAIN SELECT * FROM city USE INDEX(ix1) WHERE city_id=1; 1.2 ignore index 在查询语句中表名的后面,添加ignore index,使用mysql忽视一个或者多个索

mysql 开发进阶篇系列 47 xtrabackup (完全备份恢复,恢复后重启失败总结)

一. 完全备份恢复说明 xtrabackup二进制文件有一个xtrabackup --copy-back选项,它将备份复制到服务器的datadir目录下.下面是通过 --target-dir 指定完全备份文件的目录,还原到datadir目录下. xtrabackup --copy-back --target-dir=/data/backups/ 可以使用xtrabackup --move-back选项恢复备份.这个选项类似于xtrabackup --copy-back,唯一的区别是它将文件移动到

mysql 开发进阶篇系列 55 权限与安全(安全事项 )

一. 操作系统层面安全 对于数据库来说,安全很重要,本章将从操作系统和数据库两个层面对mysql的安全问题进行了解. 1. 严格控制操作系统账号和权限 在数据库服务器上要严格控制操作系统的账号和权限,在安装mysql时就要重视安全问题. (1) 锁定mysql用户. (2) 其它任何用户都采取独立的账号登录,管理员通过mysql专有用户管理mysql服务,或者通过 root su到mysql用户下进行管理. (3) mysql用户目录下,除了数据文件目录,其它文件和目录属主都改为root. 我本

mysql 开发进阶篇系列 20 MySQL Server(innodb_lock_wait_timeout,innodb_support_xa,innodb _log_*)

1. innodb_lock_wait_timeout mysql 可以自动监测行锁导致的死锁并进行相应的处理,但是对于表锁导致的死锁不能自动监测,所以该参数主要用于,出现类似情况的时候等待指定的时间后回滚.系统默认值是50秒.用户可以根据业务自行设置.生产环境不推荐使用过大的 innodb_lock_wait_timeout 参数值. -- 查看事务超时时间 SHOW VARIABLES LIKE 'innodb_lock_wait_timeout'; 也可以对当前会话进行超时设置如: set

mysql 开发进阶篇系列 41 mysql日志之慢查询日志

一.概述 慢查询日志记录了所有的超过sql语句( 超时参数long_query_time单位 秒),获得表锁定的时间不算作执行时间.慢日志默认写入到参数datadir(数据目录)指定的路径下.默认文件名是[hostname]_slow.log,默认超时是10秒,默认不开启慢查询日志.下面查看慢日志的几个参数: -- 是否开启慢日志 SHOW VARIABLES LIKE 'slow_query_log'; -- 慢日志文件记录位置 SHOW VARIABLES LIKE 'slow_query_

mysql 开发进阶篇系列 14 锁问题(避免死锁,死锁查看分析)

一. 概述 通常来说,死锁都是应用设计问题,通过调整业务流程,数据库对象设计,事务大小,以及访问数据库的sql语句,绝大部分死锁都可以避免,下面介绍几种避免死锁的常用 方法. 1. 在应用中,如果不同的程序并发操作多个表,应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会.按顺序对表进行操作,是很常用的一种避免死锁的操作. 比如:有二个不一样的存储过程,同时在对一个表进行复杂的删改操作.这种情况可以考虑先让一个执行完成,再让另一个在执行. 2. 在程序中以批量方式处理数据的时候,如果

mysql 开发进阶篇系列 29 数据库二进制包安装

概述 对于二进制安装,优点是可以安装到任何路径下,灵活性好,一台服务器可以安装多个mysql.缺点是已经绎过编译,性能不如源码编译得好,不能灵活定制编译参数.如果用户即不想安装最简单却不够灵活的RPM包,又不想安装复杂费时的源码包,那么已编译好的二进制包将是最好的选择. 一.步骤1: 解压glib包 -- 在 /usr/local 下创建一个mysql文件夹,用来存放 [[email protected] local]# mkdir mysql [[email protected] local]

mysql 开发进阶篇系列 34 工具篇 mysqlcheck(MyISAM表维护工具)

一.概述 mysqlcheck客户端工具可以检查和修复MyISAM表,还可以优化和分析表.实际上,它集成了mysql工具中check,repair,analyze,optimize功能,对于check 则不支持MEMORY表, repair 则不支持 InnoDB表.mysqlcheck只有在数据库运行的状态下才可运行,意味着不用停止服务操作. 下面是三种调用mysqlcheck方式: option中常用以下选项: -c, --check 检查表 -r, --repair 修复表 -a, --a

mysql 开发进阶篇系列 45 xtrabackup 安装与用户权限说明(系统用户和mysql用户)

一. 安装说明 安装XtraBackup 2.4 版本有三种方式: (1) 存储库安装Percona XtraBackup(推荐) (2 )下载的rpm或apt包安装Percona XtraBackup. (3) 源代码编译和安装. Percona为yum (Red Hat.CentOS和Amazon Linux AMI的RPM包)和apt (Ubuntu和Debian的.deb包)提供存储库,用于Percona Server.Percona XtraBackup和Percona Toolkit