一、Mysql的架构
Mysql的架构图如下:
客户端通过一些库连接到数据库服务器,线程管理模块首先会进行授权检查,检查通过后会看线程池中是否有空闲的线程,没有就新创建一个线程与客户端建立连接。
图中的SQL Interface、Parser、Optimizer、Caches&Buffers分别对应SQL语法接口、SQL解析器、优化器、缓存。
其中Caches部分默认缓存的是SQL语句,数据缓存默认是不开启的,可以通过修改配置文件重启服务开启数据缓存。
二、Mysql的存储引擎简略对比
三、Myisam
1、Myisam特点
Myisam存储引擎只支持表级锁(即操作一条记录也会锁住整个表,不适合高并发的操作),不支持事务,不支持主外键,不会缓存真实数据。所以一个表中的记录只需要查询而不需要增删改的时候,选用Myiam存储引擎效率可能比InnoDB高,存储引擎都是按照使用场景进行选择的,没有谁一定优于谁。
Myisam存储引擎适用场景:
非事务型应用(数据仓库、报表、日志数据)—只读的表。
空间类应用(空间函数、坐标)—gis。
2、数据文件说明
3、缓存
???说好的Myisam引擎不支持数据缓存???
4、表锁
① 共享读锁:LOCK TABLE X READ
使用该指令给表上读锁之后,当前会话只可以查询该表中的数据,增删改的时候会报错。如下图:
其他会话也是只可以查询表中的数据,增删改的时候会等待。如下图:
② 排他写锁:LOCK TABLE X WRITE
使用该指令给表上读锁之后,当前会话只可以对本表进行CRUD,对其他表进行操作会报错。如下图:
其他会话无法对该表进行任何操作。如下图:
③ 解锁:LOCK TABLES
四、InnoDB
1、InnoDB特点
InnoDB是一种事务型存储引擎,完全支持事务的ACID特性,支持表级锁的同时还支持行级锁(并发程度更高),支持主外键。在默认情况下,InnoDB存储引擎会把数据表集中存储在一个共享的表空间里,也可以设置为不同的数据表创建不同的文件。
2、数据文件说明
Mysql5.6.6 之后,默认为每张表分配独立的文件存储数据和索引,可通过设置SET GLOBAL innodb_file_per_table=1
来开启这个设置。不开启这个设置的时候,默认所有表都使用公共的系统表空间。如下图:
3、启用缓存
当需要使用缓存的时候,需要进入到Mysql的data目录下面修改my.ini文件。
数据文件默认的存放路径是C:\ProgramData\MySQL\MySQL Server 5.7
。
修改配置:
query_cache_type=1 #表示开启缓存
query_cache_size=128M #表示缓存的大小
但是只设置这两个值之后,发现执行SQL语句还是没有被缓存起来。
其实还需要通过执行SET GLOBAL 'query_cache_limit=128000000'
指令,设置单条结果集的上限。
4、表锁和行锁
这两个锁必须在同一个事务中包裹,即用BEGIN
和COMMIT
围住。
行锁的共享读锁:... LOCK IN SHARE MODE
行锁的排他写锁:... FOR UPDATE
机制和Myisam存储引擎的写锁和读锁相同。