Mycat主键缓存机制

一、缓存机制说明
Mycat通过schema.xml文件中的table标签primaryKey属性来指定逻辑表的主键。
当分片规则使用非主键进行分片时,那么,根据主键查询时,mycat就会对所有该表配置的dataNode进行广播式的查询。
为此,Mycat提供了“主键到分片”的内存缓存机制。
Mycat的主键缓存机制是:当根据主键查询的SQL语句第一次执行时,Mycat会对其结果进行分析,确定该主键在哪个dataNode上,并进行该主键到分片ID的缓存。那么,下次再通过该主键进行查询时,MyCat就会通过缓存先确定记录在哪个dataNode上,然后再在该dataNode上执行查询。

二、限制
Mycat触发主键缓存,有一些限制条件:
1. Mycat启动时不会触发缓存;
2. insert语句不会触发缓存;
3. 首次通过主键查询时,才会触发缓存,且仅缓存where条件指定的(必须通过=或in指定);
4. 全表查询不会触发缓存,通过非主键查询不会触发缓存,通过主键+非主键查询也不会触发缓存。只有通过主键查询才触发缓存;
5. select后的list必须要带主键的列,否则不会触发缓存;
6. 在join的sql中,也会触发查询,如:
select * from employee a, tf_user b where a.id=101 and a.sharding_id=b.user_id;
7. 按主键分片的表,mycat不会作主键缓存;

三、缓存的使用
从目前了解到的来看,以下情况mycat会先读缓存。
1. 单表查询,且指定了主键;
2. 多表关联查询,且指定了主键;
3. 带主键的update和delete语句

四、工具使用
1. explain命令
通过explain命令,可查看针对某语句,mycat会到哪些dataNode上执行。
如下表,主键为id字段,按 sharding_id字段分片。
mysql> explain select * from employee where id = 101;
+-----------+---------------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------------+
| dn1 | select * from employee where id = 101 |
| dn2 | select * from employee where id = 101 |
+-----------+---------------------------------------+
2 rows in set (0.00 sec)

mysql> select * from employee where id=101;
+-----+------+-------------+
| id | name | sharding_id |
+-----+------+-------------+
| 101 | A | 10000 |
+-----+------+-------------+
1 row in set (0.01 sec)

mysql> explain select * from employee where id = 101;
+-----------+---------------------------------------+
| DATA_NODE | SQL |
+-----------+---------------------------------------+
| dn1 | select * from employee where id = 101 |
+-----------+---------------------------------------+
1 row in set (0.00 sec)
2. show @@cache
通过连接MyCAT的9066管理端口,执行show @@cache,可以显示当前缓存的使用情况。可在sql执行前后的2个时间点执行show @@cache,通过结果信息中的LAST_PUT和LAST_ACCESS列,判断相应表的缓存是否有被更新过。
mysql> show @@cache;
+---------------------------------------+-------+------+--------+------+------+---------------+---------------+
| CACHE | MAX | CUR | ACCESS | HIT | PUT | LAST_ACCESS | LAST_PUT |
+---------------------------------------+-------+------+--------+------+------+---------------+---------------+
| ER_SQL2PARENTID | 1000 | 0 | 0 | 0 | 0 | 0 | 0 |
| SQLRouteCache | 10000 | 0 | 4 | 0 | 0 | 1513246741831 | 0 |
| TableID2DataNodeCache.TESTDB_ORDERS | 50000 | 0 | 0 | 0 | 0 | 0 | 0 |
| TableID2DataNodeCache. TESTDB_EMPLOYEE | 10000 | 1 | 4 | 1 | 1 | 1513246741832 | 1513246738065 |
+---------------------------------------+-------+------+--------+------+------+---------------+---------------+
4 rows in set (0.03 sec)

(通过主键查询语句,触发缓存)

mysql> show @@cache;
+---------------------------------------+-------+------+--------+------+------+---------------+---------------+
| CACHE | MAX | CUR | ACCESS | HIT | PUT | LAST_ACCESS | LAST_PUT |
+---------------------------------------+-------+------+--------+------+------+---------------+---------------+
| ER_SQL2PARENTID | 1000 | 0 | 0 | 0 | 0 | 0 | 0 |
| SQLRouteCache | 10000 | 0 | 5 | 0 | 0 | 1513246959373 | 0 |
| TableID2DataNodeCache.TESTDB_ORDERS | 50000 | 0 | 0 | 0 | 0 | 0 | 0 |
| TableID2DataNodeCache. TESTDB_EMPLOYEE | 10000 | 2 | 5 | 1 | 2 | 1513246959373 | 1513246959375 |
+---------------------------------------+-------+------+--------+------+------+---------------+---------------+
4 rows in set (0.00 sec)


你可能感兴趣的:(数据库中间件/Mycat)