すべてのプロダクト
Search
ドキュメントセンター

ApsaraDB RDS:SQL 速度制限

最終更新日:Dec 05, 2025

Alibaba Cloud は、同時実行制御 (CCL) 機能と DBMS_CCL パッケージを提供し、予期しないリクエストトラフィック、リソースを大量に消費する文、SQL アクセスモデルの変更が発生した場合でも ApsaraDB RDS for MySQL インスタンスの安定性を確保します。CCL 機能は構文ルールに基づいて開発されています。DBMS_CCL パッケージを使用すると、特定の種類の SQL 文の最大同時実行数を制限できます。同時実行される SQL 文の数が上限に達した場合、超過した SQL 文は、数が上限を下回るまで待機状態になります。

前提条件

サポートされているインスタンスのバージョンは次のとおりです。

  • マイナーエンジンバージョンが 20190816 以降の MySQL 8.0

  • マイナーエンジンバージョンが 20200630 以降の MySQL 5.7

パラメーター

パラメーター

説明

ccl_max_waiting_count

同じ CCL ルールに対して Concurrency control waiting 状態にできる SQL 文の最大数です。この制限を超えると、SQL 文は失敗し、エラーコード ERROR 7534 (HY000): Concurrency control waiting count exceed max waiting count が返されます。デフォルト値は 0 で、制限がないことを意味します。

ccl_wait_timeout

SQL 文が Concurrency control waiting 状態で待機できる最大時間です。この時間制限を超えると、SQL 文は実行を継続し、CCL ルールによる制限を受けなくなります。デフォルト値は 86,400 秒です。

注意事項

  • ログが生成されないため、CCL 操作は現在の RDS インスタンスにのみ影響します。たとえば、プライマリ RDS インスタンスで実行された CCL 操作は、セカンダリ RDS インスタンス、読み取り専用 RDS インスタンス、またはディザスタリカバリインスタンスには同期されません。

  • CCL は、DML 文によって引き起こされるトランザクションのデッドロックを解決するためのタイムアウトメカニズムを提供します。保留中のスレッドも、トランザクションのタイムアウトとスレッドの終了に応答して、デッドロックを防ぎます。

機能説明

CCL は、次のディメンションに基づいて機能を提供します。

  • SQL コマンド:SELECT、UPDATE、INSERT、DELETE などの SQL コマンドの種類。

  • オブジェクト:TABLE や VIEW など、SQL コマンドが操作するオブジェクト。

  • キーワード:SQL コマンド内のキーワード。

  • テンプレート:SQL コマンドのテンプレート。

CCL テーブルの作成

AliSQL は、`concurrency_control` という名前のシステムテーブルを使用して CCL ルールを格納します。システムは起動時にこのテーブルを自動的に作成します。次の文を実行してテーブルを作成できます。

CREATE TABLE `concurrency_control` (
  `Id` bigint NOT NULL AUTO_INCREMENT,
  `Type` enum('SELECT','UPDATE','INSERT','DELETE','TEMPLATE') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'SELECT',
  `Schema_name` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
  `Table_name` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
  `Concurrency_count` bigint NOT NULL,
  `Keywords` text COLLATE utf8mb3_bin,
  `State` enum('N','Y') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Y',
  `Ordered` enum('N','Y') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N',
  `Digest` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
  `SQL_template` longtext COLLATE utf8mb3_bin,
  PRIMARY KEY (`Id`)
) /*!50100 TABLESPACE `mysql` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0 COMMENT='Concurrency control'

パラメーター

説明

Id

CCL ルールの ID です。

Type

SQL 文の種類です。

Schema_name

データベースの名前です。

Table_name

データベース内のテーブルの名前です。

Concurrency_count

同時実行数です。0 に設定すると、このルールに一致するすべての SQL 文が拒否され、エラーコード ERROR 7535 (HY000): Concurrency control refuse to execute query が返されます。

Keywords

キーワードです。複数のキーワードはセミコロン (;) で区切ります。

State

ルールを有効にするかどうかを指定します。

Ordered

複数の keywords を順番に照合するかどうかを指定します。

Digest

SQL_template に基づいてハッシュ計算を実行して取得される 64 バイトのハッシュ文字列です。

SQL_template

SQL 文のテンプレートです。

CCL ルールの管理

CCL ルールの管理を簡素化するために、AliSQL は DBMS_CCL で次の 4 つのローカル記憶域ルールを提供します:

add_ccl_rule:ルールの追加

  • コマンドテンプレート

    dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');
    • SQL コマンドの種類に対するルールの追加:すべての SELECT 文の同時実行数を 10 に設定します。

      mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');
    • キーワードに対するルールの追加:キーワード `key1` を含む SELECT 文の同時実行数を 20 に設定します。

      mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');
    • 完全なルールの追加:キーワード `key2` を含む `test.t` テーブルに対する SELECT 文の同時実行数を 20 に設定します。

      mysql> call dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 20, 'key2');

add_ccl_template_rule:テンプレートベースのルールの追加

  • 前提条件

    テンプレートベースのルールを追加するには、インスタンスが次のいずれかのバージョン要件を満たしている必要があります:

    • マイナーエンジンバージョンが 20230630 以降の MySQL 8.0

    • マイナーエンジンバージョンが 20241231 以降の MySQL 5.7

  • コマンドテンプレート

    dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'', 'Template_sql');
    説明
    • `Table_name` パラメーターを指定する必要はありません。`Template_sql` パラメーターには 1 つの SQL 文を指定する必要があります。

    • `STATEMENT_DIGEST_TEXT` ビルトイン関数を使用して、SQL 文に対応する SQL テンプレートを表示できます。

  • テンプレートベースのルールを追加して、`test` データベース内でテンプレート 'SELECT c FROM t1 WHERE id=?' に一致する SQL 文の同時実行数を 30 に設定します。

    call dbms_ccl.add_ccl_rule('TEMPLATE', 'test', '', 30, '', 'SELECT c FROM t1 WHERE id=4');
    説明
    • 各 SQL 文は 1 つのルールにしか一致しません。

    • 異なる種類のルールは、テンプレートルール、完全なルール、キーワードルール、SQL 文ルールの降順でリストされます。各ルールセットは、ルールがヒットするかどうかを判断するために順番にチェックされます。

del_ccl_rule:ルールの削除

  • コマンドテンプレート

    dbms_ccl.del_ccl_rule(<Id>);
  • ID が 15 の CCL ルールを削除します。

    mysql> call dbms_ccl.del_ccl_rule(15);
    説明

    削除したいルールが存在しない場合、システムは警告を報告します。show warnings; コマンドを実行して警告メッセージを表示できます。

    mysql> call dbms_ccl.del_ccl_rule(100);
      Query OK, 0 rows affected, 2 warnings (0.00 sec)
    
    mysql> show warnings;
    +---------+------+----------------------------------------------------+
    | Level   | Code | Message                                            |
    +---------+------+----------------------------------------------------+
    | Warning | 7514 | Concurrency control rule 100 is not found in table |
    | Warning | 7514 | Concurrency control rule 100 is not found in cache |
    +---------+------+----------------------------------------------------+

show_ccl_rule:メモリ内の有効なルールの表示

  • コマンドテンプレート

    dbms_ccl.show_ccl_rule();
  • mysql> call dbms_ccl.show_ccl_rule();
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
    |   17 | SELECT | test   | t     | Y     | N     |                30 |       0 |       0 |        0 |          |
    |   16 | SELECT |        |       | Y     | N     |                20 |       0 |       0 |        0 | key1     |
    |   18 | SELECT |        |       | Y     | N     |                10 |       0 |       0 |        0 |          |
    +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+

    MATCHEDRUNNING、および WAITING 列について、次の表で説明します。

    パラメーター

    説明

    MATCHED

    ルールが照合された回数です。

    RUNNING

    ルールに基づいて同時実行されているスレッドの数です。

    WAITTING

    ルールに基づいて待機中のスレッドの数です。

flush_ccl_rule:ルール変更の適用

  • コマンドテンプレート

    `concurrency_control` テーブルでルールを直接変更した場合、変更はすぐには有効になりません。次のコマンドを実行して変更を適用する必要があります:

    dbms_ccl.flush_ccl_rule();
  • mysql> update mysql.concurrency_control set CONCURRENCY_COUNT = 15 where Id = 18;
    Query OK, 1 row affected (0.00 sec)
    Rows matched: 1  Changed: 1  Warnings: 0
    
    mysql> call dbms_ccl.flush_ccl_rule();
    Query OK, 0 rows affected (0.00 sec)

機能テスト

  • テストルール

    次の 3 つのルールは 3 つのディメンションに対応しています:

    -- sbtest1 キーワードを持つ SELECT 文の同時実行数が 3 であるルールを作成します。
    call dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, '');
    
    -- sbtest2 キーワードを持つ SELECT 文の同時実行数が 2 であるルールを作成します。
    call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2');  
    
    -- SELECT 文の同時実行数が 2 であるルールを作成します。
    call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');
  • テストシナリオ

    次のシナリオで sysbench を使用してテストします。

    • 64 スレッド

    • 4 テーブル

    • select.lua

  • テスト結果

    次の文を実行して、ルールに基づいた同時実行スレッドの数をクエリします。

    mysql> call dbms_ccl.show_ccl_rule();
    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    | ID   | TYPE   | SCHEMA | TABLE   | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS |
    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    |   20 | SELECT | test   | sbtest1 | Y     | N     |                 3 |     389 |       3 |        9 |          |
    |   21 | SELECT |        |         | Y     | N     |                 2 |     375 |       2 |       14 | sbtest2  |
    |   22 | SELECT |        |         | Y     | N     |                 2 |     519 |       2 |       34 |          |
    +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+
    3 rows in set (0.00 sec)

    RUNNING 列に表示される数値は、ルールの作成時に指定した数値と同じです。