PolarDB设计了针对语句的排队机制,将语句进行分桶排队,尽量把可能具有相同冲突(例如操作相同行)的语句放在一个桶内排队,减少冲突的开销。

背景信息

MySQL的服务层和引擎层在语句并发执行过程中,有很多串行的点容易导致冲突。例如在DML语句中,比较常见的是事务锁冲突。InnoDB中事务锁的最细粒度是行级锁,如果语句针对相同行进行并发操作,会导致比较严重的冲突,系统吞吐量会随着并发的增加而递减。PolarDB提供Statement Queue机制,能够减少冲突开销、有效提高实例性能。

前提条件

PolarDB集群版本需为PolarDB MySQL 5.6或PolarDB MySQL 8.0。

变量

PolarDB提供了如下两个变量来定义语句队列的桶数量和大小:

变量 说明
ccl_queue_bucket_count 表示桶的数量,取值范围为1~64,默认值为4。
ccl_queue_bucket_size 表示一个桶允许的并发数,取值范围为1~4096,默认值为64。

语法

POLARDB_STATEMENT_CONCURRENT_QUEUE field语法支持SELECT、UPDATE、INSERT和DELETE等语句。

您可以根据如下两种方式进行hash分桶。

  • 根据int或string值进行hash分桶。
    • 语法:
      POLARDB_STATEMENT_CONCURRENT_QUEUE [int | string]
    • 示例:
      insert POLARDB_STATEMENT_CONCURRENT_QUEUE 1 into t values(1, 1, 'xpchild');
      update POLARDB_STATEMENT_CONCURRENT_QUEUE 1 t set c=c+1 where id = 1;
      update POLARDB_STATEMENT_CONCURRENT_QUEUE "xpchild" t set col1 = col1+1 where id =1;
  • 根据field值进行hash分桶。
    • 语法:
      POLARDB_STATEMENT_CONCURRENT_QUEUE [field]
    • 示例:
       select POLARDB_STATEMENT_CONCURRENT_QUEUE id * from t where 3 = id;
       update POLARDB_STATEMENT_CONCURRENT_QUEUE id t set c=c+1 where id = 1 and name = 'xpchild';
      说明 POLARDB_STATEMENT_CONCURRENT_QUEUE field语法中,where条件只支持原始字段(没有在字段上使用任何函数、计算等)的二元运算。

接口

PolarDB提供如下两个接口便于您查询Statement Queue状态。

  • dbms_ccl.show_ccl_queue()

    查询当前Statement Queue状态。

    mysql> call dbms_ccl.show_ccl_queue();   
    +------+-------+-------------------+---------+---------+----------+
    | ID   | TYPE  | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING |
    +------+-------+-------------------+---------+---------+----------+
    |    1 | QUEUE |                64 |       1 |       0 |        0 |
    |    2 | QUEUE |                64 |   40744 |      65 |        6 |
    |    3 | QUEUE |                64 |       0 |       0 |        0 |
    |    4 | QUEUE |                64 |       0 |       0 |        0 |
    +------+-------+-------------------+---------+---------+----------+
    4 rows in set (0.01 sec)
    说明 对其中的CONCURRENCY_COUNTMATCHEDRUNNINGWAITTING说明如下。
    • CONCURRENCY_COUNT:最大并发数。
    • MATCHED:命中规则的总数。
    • RUNNING:当前并发的数量。
    • WAITTING:当前等待的数量。
  • dbms_ccl.flush_ccl_queue()

    清理内存中的数据。

    mysql> call dbms_ccl.flush_ccl_queue();                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       Query OK, 0 rows affected (0.00 sec)
    
    mysql> call dbms_ccl.show_ccl_queue();
    +------+-------+-------------------+---------+---------+----------+
    | ID   | TYPE  | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING |
    +------+-------+-------------------+---------+---------+----------+
    |    1 | QUEUE |                64 |       0 |       0 |        0 |
    |    2 | QUEUE |                64 |       0 |       0 |        0 |
    |    3 | QUEUE |                64 |       0 |       0 |        0 |
    |    4 | QUEUE |                64 |       0 |       0 |        0 |
    +------+-------+-------------------+---------+---------+----------+
    4 rows in set (0.00 sec)