0
点赞
收藏
分享

微信扫一扫

【Java架构师入门到精通提升】mysql优化

  1. mysql引擎
    1.1. 引擎类型
    MySQL常用的存储引擎为MyISAM、InnoDB、MEMORY、MERGE,其中InnoDB提供事务安全表,其他存储引擎都是非事务安全表。
    MyISAM是MySQL的默认存储引擎。MyISAM不支持事务、也不支持外键,但其访问速度快,对事务完整性没有要求。
    innoDB存储引擎提供了具有提交、回滚和崩溃恢复能力的事务安全。但是比起MyISAM存储引擎,InnoDB写的处理效率差一些并且会占用更多的磁盘空间以保留数据和索引
    MEMORY存储引擎使用存在内存中的内容来创建表。每个MEMORY表只实际对应一个磁盘文件。MEMORY类型的表访问非常得快,因为它的数据是放在内存中的,并且默认使用HASH索引。但是一旦服务关闭,表中的数据就会丢失掉。想学习交流HashMap,nginx、dubbo、Spring MVC,分布式、高性能高可用、MySQL,redis、jvm、多线程、netty、kafka、的加尉xin(同英):cgmx9880 扩列获取java进阶资料学习,无工作经验不要加哦!

MERGE存储引擎是一组MyISAM表的组合,这些MyISAM表必须结构完全相同。MERGE表本身没有数据,对MERGE类型的表进行查询、更新、删除的操作,就是对内部的MyISAM表进行的。
1.2. 如何选择合适的存储引擎
选择标准: 根据应用特点选择合适的存储引擎,对于复杂的应用系统可以根据实际情况选择
多种存储引擎进行组合.
下面是常用存储引擎的适用环境:
1.MyISAM:默认的 MySQL 插件式存储引擎,它是在 Web、数据仓储和其他应用环境下最常使用的存储引擎之一
2.InnoDB:用于事务处理应用程序,具有众多特性,包括 ACID 事务支持。
3.Memory:将所有数据保存在 RAM 中,在需要快速查找引用和其他类似数据的环境下,可提供极快的访问。
4.Merge:允许 MySQL DBA 或开发人员将一系列等同的 MyISAM 表以逻辑方式组合在一起,
并作为 1 个对象引用它们。对于诸如数据仓储等 VLDB 环境十分适合
2. 设置高速缓存
注:可以通过order by语句测试缓存,order by语句执行速度慢!
2.1. 设置高速缓存
2.1.1. 查看高速缓存是否支持
SHOW VARIABLES LIKE ‘have_query_cache’;
2.1.2. 设置和查询高速缓存大小
SET GLOBAL query_cache_size = 41984; #40K
SHOW VARIABLES LIKE ‘query_cache_size’;
±-----------------±------+
| Variable_name | Value |
±-----------------±------+
| query_cache_size | 41984 |
±-----------------±------+
2.1.3. 缓存开启的方式
查看是否开启
SHOW VARIABLES LIKE ‘query_cache_type’;
开启
SET SESSION query_cache_type = ON;

如果查询缓存大小设置为大于0,query_cache_type变量影响其工作方式。这个变量可以设置为下面的值:
0或OFF:将阻止缓存或查询缓存结果。
1或ON:将允许缓存,以SELECT SQL_NO_CACHE开始的查询语句除外。
2或DEMAND:仅对以SELECT SQL_CACHE开始的那些查询语句启用缓存。

另外:
GLOBAL:设置所有链接的客户端
session:设置单个客户端
2.1.4. 设置缓存结果的最大值最小值
如果不设置缓存的上线下线,查询结果过大将不会缓存。
查询上线:
SHOW VARIABLES LIKE ‘query_cache_limit’;
设置上下线:
SET GLOBAL query_cache_limit=10485760; #10M
SET GLOBAL query_cache_min_res_unit=41984;
2.1.5. 查询高速缓冲状态和维护
可以使用下面的语句检查MySQL服务器是否提供查询缓存功能:
SHOW VARIABLES LIKE ‘have_query_cache’;
±-----------------±------+
| Variable_name | Value |
±-----------------±------+
| have_query_cache | YES |
±-----------------±------+
FLUSH QUERY CACHE:语句来清理查询缓存碎片以提高内存使用性能。该语句不从缓存中移出任何查询。
RESET QUERY CACHE:语句从查询缓存中移出所有查询。FLUSH TABLES语句也执行同样的工作。
SHOW STATUS:为了监视查询缓存性能,使用SHOW STATUS查看缓存状态变量,例如:
mysql> SHOW STATUS LIKE ‘Qcache%’;
±------------------------±-------+
| Qcache_free_blocks | 36 |
| Qcache_free_memory | 138488 |
| Qcache_hits | 79570 |
| Qcache_inserts | 27087 |
| Qcache_lowmem_prunes | 3114 |
| Qcache_not_cached | 22989 |
| Qcache_queries_in_cache | 415 |
| Qcache_total_blocks | 912 |
±------------------------±-------+
QCACHE_free_blocks:空闲内存块的数量。
QCACHE_free_memory:空闲内存的大小。
QCACHE_hits:查询缓存被访问的次数(命中数)。
QCACHE_inserts:加入到缓存的查询数量。
QCACHE_lowmem_prunes:由于内存较少从缓存删除的查询数量。
QCACHE_not_cached:非缓存查询数(不可缓存,或由于query_cache_type设定值未缓存)。
Qcache_queries_in_cache:登记到缓存内的查询的数量。
Qcache_total_blocks:查询缓存内的总块数。
2.2. 高速缓存语句要求
下面的两个查询被查询缓存认为是不相同的:
SELECT * FROM tbl_name
Select * from tbl_name
查询必须是完全相同的(逐字节相同)才能够被认为是相同的。
2.3. 不缓存的语句
如果一个查询包含下面函数中的任何一个,它不会被缓存:
BENCHMARK()
CONNECTION_ID()
CURDATE()
CURRENT_DATE()
CURRENT_TIME()
CURRENT_TIMESTAMP()
CURTIME()
DATABASE()
带一个参数的ENCRYPT()
FOUND_ROWS()
GET_LOCK()
LAST_INSERT_ID()
LOAD_FILE()
MASTER_POS_WAIT()
NOW()
RAND()
RELEASE_LOCK()
SYSDATE()
不带参数的UNIX_TIMESTAMP()
USER()
3. EXPLAIN执行计划

举报

相关推荐

0 条评论