MySQL优化之引擎与查询缓存(三)

MySQL优化之引擎与查询缓存(三)

我们首先要了解为什么要用引擎:
MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种技术都使用不同的存储机制、索引技巧、锁定水平并且最终提供广泛的不同的功能和能力。通过选择不同的技术,你能够获得额外的速度或者功能,从而改善你的应用的整体功能。
这些不同的技术以及配套的相关功能在MySQL中被称作存储引擎(也称作表类型)。MySQL默认配置了许多不同的存储引擎,可以预先设置或者在MySQL服务器中启用。你可以选择适用于服务器、数据库和表格的存储引擎,以便在选择如何存储你的信息、如何检索这些信息以及你需要你的数据结合什么性能和功能的时候为你提供最大的灵活性。

MySQL的常用引擎一般有两种,一种是MyISAM,另一种是Innodb。
两者的区别在哪里呢?

Innodb引擎:
支持事务、行级锁,外键
存储方式:数据和索引存在一起(.frm)
表可移动性:可以通过移动表对应的MIY和MYD能够实现表的移动,Innodb还有额外的关联文件
碎片空间:不产生碎片空间
有序存储:插入数据时按照主键有序插入,因此表中的数据默认按主键有序(写入时间长,需要在b+TREE中查找插入点,但查找效率高)
选择依据:在读写频率都很高的情况下可以选择使用,因为支持事务/外键、可以保证数据的一致性,完整性,并发能力也高;
数据恢复:可以从灾难中恢复(通过bin-log日志等)
ACID事务
A 事务的原子性(Atomicity):指一个事务要么全部执行,要么不执行.也就是说一个事务不可能只执行了一半就停止了.比如你从取款机取钱,这个事务可以分成两个步骤:1划卡,2出钱.不可能划了卡,而钱却没出来.这两步必须同时完成.要么就不完成.
C 事务的一致性(Consistency):指事务的运行并不改变数据库中数据的一致性.例如,完整性约束了a+b=10,一个事务改变了a,那么b也应该随之改变.
I 独立性(Isolation):事务的独立性也有称作隔离性,是指两个以上的事务不会出现交错执行的状态.因为这样可能会导致数据不一致.
D 持久性(Durability):事务的持久性是指事务执行成功以后,该事务所对数据库所作的更改便是持久的保存在数据库之中,不会无缘无故的回滚.

MyISAM引擎:
不支持事务,外键,行锁,
存储方式: 数据和索引分别存放在MYI,MYD中
表可移动性:可以通过移动表对应的MIY和MYD能够实现表的移动
碎片空间: 删除数据时会产生碎片空间,需要定期通过optimize table table-name手动优化
选择依据:在读取多写入少的情况下 使用MyISAM,比如博客,新闻等网站
数据恢复:不能主动恢复数据
存储文件:引擎在创建表的时候,会创建三个文件,一个是.frm文件用于存储表的定义,一个是.MYD文件用于存储表的数据,另一个是.MYI文件,存储的是索引。操作系统对大文件的操作是比较慢的,这样将表分为三个文件,那么.MYD这个文件单独来存放数据自然可以优化数据库的查询等操作。有索引管理和字段管理。MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。

锁的种类
表级锁:开销小,加锁块;不会出现死锁,锁定粒度大,发生锁冲突的概率最高,并发度最低。
行级锁:开销大,加锁慢;会出现死锁;锁定粒度最小,发生锁冲突的概率最低,并发性也最高。
页面锁:开销和加锁界于表锁和行锁之间,会出现死锁;锁定粒度界与表锁和行锁之间,并发一般。

MySQL 查询缓存

输入SHOW VARIABLES LIKE ‘%query_cache%’;

在这里插入图片描述
query_cache_type
查询缓存类型,有0、1、2三个取值。0则不使用查询缓存。1表示始终使用查询缓存。2表示按需使用查询缓存。
如果query_cache_type为1而又不想利用查询缓存中的数据,可以用下面的SQL:
SELECT SQL_NO_CACHE * FROM my_table WHERE condition;
如果值为2,要使用缓存的话,需要使用SQL_CACHE开关参数:
SELECT SQL_CACHE * FROM my_table WHERE condition;

query_cache_size
默认情况下query_cache_size为0,表示为查询缓存预留的内存为0,则无法使用查询缓存。所以我们需要设置query_cache_size的值:
SET GLOBAL query_cache_size = 134217728;
注意上面的值如果设得太小不会生效。比如我用下面的SQL设置query_cache_size大小:
SET GLOBAL query_cache_size = 4000;

重置缓存:reset query cache

缓存数据失效时机
在表的结构或数据发生改变时,查询缓存中的数据不再有效。有这些INSERT、UPDATE、 DELETE、TRUNCATE、ALTER TABLE、DROP TABLE或DROP DATABASE会导致缓存数据失效。所以查询缓存适合有大量相同查询的应用,不适合有大量数据更新的应用。

Guess you like

Origin blog.csdn.net/SKY_PLA/article/details/101163195