mysql基础之查询缓存、存储引擎
一、查询缓存
“查询缓存”,就是将查询的结果缓存下载,如果查询语句完全相同,则直接返回缓存中的结果。
如果应用程序在某个场景中,需要经常执行大量的相同的查询,而且查询出的数据不会经常被更新,那么,使用查询缓存会有一定的性能提升。
查看当前服务是否开启了查询缓存功能:
MariaDB [ren]> show variables like '%query_cache%'; +------------------------------+---------+ | Variable_name | Value | +------------------------------+---------+ | have_query_cache | YES | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 1048576 | | query_cache_strip_comments | OFF | | query_cache_type | OFF | | query_cache_wlock_invalidate | OFF | +------------------------------+---------+ 7 rows in set (0.00 sec)
query_cache_type的值设置了OFF,表示目前没有开启查询缓存功能
query_cache_type的值可以设置为:ON、OFF、DEMAND,分别表示已启用、已禁用、按需缓存,设置在配置文件/etc/my.cnf.d/server.cnf中即可。
have_query_cache的值为YES,表示当前数据库支持缓存功能
query_cache_limit表示单条查询缓存的最大值,如果查询结果超过此值的大小,即时指定缓存当前结果,结果也不会被缓存,默认值为1M。
query_cache_min_res_unit表示缓存存储于内存的最小单元,默认为4K,也就是说,即时查询结果只有1K,也会占用4K内存,所以,如果此值设置的过大,会造成内存空间的浪费,如果此值设置的过小,则会频繁的分配内存单元或者频繁的回收内存单元。
query_cache_size表示查询缓存的总大小,也就是说,内存中用于查询缓存的空间大小,如果其值为0,即时开启了查询缓存,也无法缓存。
query_cache_wlock_invalidate表示查询语句所查询的表如果被写锁锁定,是否仍然使用缓存返回结果。也就是“查询缓存遭遇写锁时是否失效”,设置为OFF表示“不失效”;设置为ON表示“失效”。当此值设置为ON,如果表被施加了写锁,那么当写锁释放时,数据可能发生了改变,所以在表被施加写锁期间,即时此时有查询语句命中了查询缓存,也不能从缓存获取结果。(此值设置为OFF时,性能更好,并发能力更好,此值设置为ON时,更加安全,保证了数据的一致性)(写锁时独立的,排他的)
查询语句完全相同时,缓存才能够被命中,完全相同表示大小写也相同。
一般在数据变化不频繁,且又需要重复执行相同查询的场景中使用缓存。
二、使用查询缓存
使用方式:
开启缓存:query_cache_type=ON后,指定对应的查询语句不适用缓存:select sql_no_cache name from stu;按需使用缓存:query_cache_type=DEMAND,指定对应的查询语句使用缓存 select sql_cache name from stu;
第一种是默认符合缓存条件的都缓存,只有使用sql_no_cache指定的语句不缓存
第二种是默认所有查询语句的结果都不缓存,只有使用sql_cache指定的语句才会缓存
例子:
[root@ren7 ~]# vim /etc/my.cnf.d/server.cnf #############################################[server] query_cache_type=DEMAND query_cache_size=100M############################################# [root@ren7 ~]# systemctl restart mariadb
查看查询缓存相关的参数:
MariaDB [ren]> show variables like '%query%'; +------------------------------+---------------+ | Variable_name | Value | +------------------------------+---------------+ | expensive_subquery_limit | 100 | | ft_query_expansion_limit | 20 | | have_query_cache | YES | | long_query_time | 10.000000 | | query_alloc_block_size | 16384 | | query_cache_limit | 1048576 | | query_cache_min_res_unit | 4096 | | query_cache_size | 104857600 | | query_cache_strip_comments | OFF | | query_cache_type | DEMAND | | query_cache_wlock_invalidate | OFF | | query_prealloc_size | 24576 | | slow_query_log | OFF | | slow_query_log_file | ren7-slow.log | +------------------------------+---------------+ 14 rows in set (0.00 sec)
执行三次查询语句:MariaDB [ren]> select sql_cache * from students where id=8; +----+--------------+------+------+--------+--------+-----------+ | id | name | age | high | gender | cls_id | is_delete | +----+--------------+------+------+--------+--------+-----------+ | 8 | 周杰伦儿 | 34 | NULL | 男 | 1 | | +----+--------------+------+------+--------+--------+-----------+ 1 row in set (0.00 sec)
查看缓存命中的情况:
MariaDB [ren]> show status like 'Qcache%'; +-------------------------+-----------+ | Variable_name | Value | +-------------------------+-----------+ | Qcache_free_blocks | 1 | | Qcache_free_memory | 104838240 | | Qcache_hits | 2 | | Qcache_inserts | 1 | | Qcache_lowmem_prunes | 0 | | Qcache_not_cached | 0 | | Qcache_queries_in_cache | 1 | | Qcache_total_blocks | 4 | +-------------------------+-----------+ 8 rows in set (0.00 sec)
Qcache_free_blocks表示已分配的内存中空闲块的数量;
Qcache_free_memory表示查询缓存的空闲总量大小;
Qcache_hits表示以被缓存的条目的命中次数;
Qcache_inserts表示在未命中缓存时,将查询结果写入缓存的次数;
Qcache_lowmem_prunes表示用于查询缓存的内存区域的修剪次数(当用于缓存的内存被占满时,mysql会使用LRU算法清除命中率低的缓存项,从而空余出部分内存空间,用于缓存新的“查询缓存”);
Qcache_not_cached表示没有被缓存的查询语句的数量;
Qcache_queries_in_cache表示已经缓存的SQL语句的数量;
Qcache_total_blocks表示当前查询缓存占用的内存的block数量。
查询缓存的碎片率 = (Qcache_free_blocks / Qcache_total_blocks)* 100%查询缓存利用率 = (Qcache_cache_size - Qcache_free_memory) / query_cache_size * 100%query_cache_min_res_unit的预估值参考计算公式:(query_cache_size - Qcache_free_memory)/ Qcache_queries_in_cache查询缓存命中率 = (Qcache_hits / Com_select)* 100%
Com_select表示查询语句的执行次数:
MariaDB [ren]> show status like 'Com_select%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | Com_select | 3 | +---------------+-------+ 1 row in set (0.00 sec)
flush query cache;可以清理查询缓存碎片,但并不会从缓存中移除任何缓存;
reset query cache;会从查询缓存中移除所有查询结果的缓存。
三、存储引擎
mysql中,存储引擎是插件式的,同一个数据库中的不同的表可以使用不同的存储引擎,所以,存储引擎是表级别的概念,存储引擎也被称为“表类型”,每张表可以使用不同的存储引擎类型。
mysql中最常用的存储引擎是innodb与myisam。
MYISAM:支持表级锁,不支持行级锁,不支持事务,不支持外键约束,支出全文索引,表空间文件相对小;
INNODB:支持表级锁,行级锁,支持事务,支持外键,不支持全文索引,表空间文件相对较大。
1、查看表类型,查看存储引擎
MariaDB [ren]> show engines; +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ | MRG_MyISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | CSV | YES | Stores tables as CSV files | NO | NO | NO | | SEQUENCE | YES | Generated tables filled with sequential values | YES | NO | YES | | MyISAM | YES | Non-transactional engine with good performance and small data footprint | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | | InnoDB | DEFAULT | Supports transactions, row-level locking, foreign keys and encryption for tables | YES | YES | YES | | Aria | YES | Crash-safe tables with MyISAM heritage | NO | NO | NO | | PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO | +--------------------+---------+----------------------------------------------------------------------------------+--------------+------+------------+ 8 rows in set (0.00 sec)
转载于:https://www.cnblogs.com/renyz/p/11448692.html
mysql基础之查询缓存、存储引擎相关推荐
- MySQL学习笔记之五:存储引擎和查询缓存
一.存储引擎 1.InnoDB ⑴InnoDB是基于聚簇索引建立的,基于主键索引查询时,性能较好:它的辅助索引中必须包含主键列:因此,若表上的索引较多,为节约空间,主键应尽可能小 ⑵InnoDB支持自 ...
- 互联网行业中最常用的数据库——MySQL 索引、事务与存储引擎
MySQL 索引.事务与存储引擎 一.MySQL 索引 1.1 索引的概念 1.2 索引的作用及缺点 1.2.1 优点 1.2.2 缺点 1.3 创建索引的原则依据 1.4 索引的分类和创建 1.4. ...
- 《MySQL技术内幕:InnoDB存储引擎》第2版笔记
第1章 MySQL体系结构和存储引擎 1.1 定义数据库和实例 在MySQL数据库中,数据库文件可以是fm.MYD.MYI.ibd结尾的文件. MySQL数据库由后台线程以及一个共享内存区组成. My ...
- 数据库 MySQL 之 表操作、存储引擎
数据库 MySQL 之 表操作.存储引擎 浏览目录 创建(复制) 删除 修改 查询 存储引擎介绍 一.创建(复制) 1.语法: 1 2 3 4 5 CREATE TABLE 表名( 字段名1 ...
- 数据库(mysql)之事务和存储引擎
目录 MySQL事务 一.事务的概念 二.事务的ACID特点 2.1原子性 2.2一致性 2.3隔离性 2.4持久性 三.数据不一致产生的结果 3.1脏读(读取未提交的数据) 3.2不可重复读(前后多 ...
- 看完就懂——MySQL索引、事务与存储引擎
目录 前言 一.索引(index) 1.1 索引的概念 1.2 索引的作用 1.3 索引的优缺点 1.4 索引的分类 1.5 创建索引的原则依据 1.6 创建索引 1.6.1 普通索引 1.6.2 唯 ...
- MySQL 5.7 支持的存储引擎
数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 获得特 ...
- MySQL的几种常用存储引擎
MySQL有9种存储引擎,不同的引擎,适合不同的场景,我们最常用的,可能就是InnoDB,应该是从5.5开始,就成为了MySQL的默认存储引擎. show engines可以查询MySQL支持的这几种 ...
- MySQL教程——3 中级篇(存储引擎、优化SQL步骤、索引的使用)
Mysql高级-day02 1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & ...
- MySQL常见的三种存储引擎(InnoDB、MyISAM、MEMORY)
MySQL是我们经常使用的数据库处理系统(DBMS),不知小伙伴们有没有注意过其中的"存储引擎"(storage_engine)呢?有时候面试题中也会问道MySQL几种常用的存储引 ...
最新文章
- vcenter用到java吗_Vijava 学习笔记之 VCenter连接
- mysql数据横表变成竖表_MySQL中横表和竖表相互转换
- 使用Apache ActiveMQ的JMS开发基础
- 手机端input[type=date]的placeholder不起作用
- HDoj-1863-畅通project-并查集
- useState使用和原理
- 想为自己设置的软件加一个属于自己的图标吗?使用AWT_Swing_图标解决你的问题(源码解析)
- 【图像隐写】基于matlab DWT数字水印嵌入+提取+攻击【含Matlab源码 622期】
- android studio for android learning (十四) android的数据的存储sharedPreferences
- 2013Esri全球用户大会QA之ArcGIS Online(上)
- SEM常用的数据统计工具之百度统计
- php 极光推送别名数组,PHP使用极光推送-Go语言中文社区
- 浅谈机器人比赛中的系统工程和组织管理
- 链家网爬取深圳租房分析
- Laravel -服务器配置-1
- 某公司员工的工资计算方法如下:一周内工作时间不超过40小时,按正常工作时间计酬;超出40小时的工作时间部分,按正常工作时间报酬的1.5倍计酬。员工按进公司时间分为新职工和老职工,进公司不少于5年的员工
- 漫谈OCL概念、特征和实践(作者:大雁北飞)
- 大平台压榨亏损2000万怎么办?换流量变现策略才是王道!
- swagger-ui导出word接口文档
- inline-bock间隙问题
热门文章
- 什么是dos及常见命令详解
- HTTP Get与Post的区别
- 如何在 Mac 上将 WebP 图像批量转换为 JPG?
- iOS系统突然故障卡死怎么办?快速解决不求人
- SIM800C 使用基站定位
- 【声明】前方不设坑位,不收费!~ 我为NET狂官方学习计划
- [Linux] ubuntu server sudo出现sudo:must be setuid root 完美解决办法
- 2008 Asia Harbin Regional Contest Online Turn the corner (三分)
- Normalize.css – 现代 Web 开发必备的 CSS resets
- UNIX环境高级编程——记录上锁(fcntl函数)以及死锁检测