# プライマリキーの非クラスタ化インデックス
```
tidb> CREATE TABLE test.example_table1 (
  example_id BIGINT PRIMARY KEY ~!@NONCLUSTERED@!~,
  example_content VARCHAR(60)
);

tidb> CREATE TABLE test.example_table2(
  example_pk1 INT,
  example_pk2 VARCHAR(10),
  example_content VARCHAR(60),
  PRIMARY KEY (example_pk1, example_pk2) ~!@NONCLUSTERED@!~
);

tidb> SELECT TABLE_NAME, TIDB_PK_TYPE
  FROM information_schema.tables 
  WHERE table_schema = 'test' 
  AND table_name in ('example_table1','example_table2');

+----------------+--------------+
| TABLE_NAME     | TIDB_PK_TYPE |
+----------------+--------------+
| example_table1 | ~!@NONCLUSTERED@!~ |
| example_table2 | ~!@NONCLUSTERED@!~ |
+----------------+--------------+
```

![`smart`](NonClusteredTableWithPrimaryKey_ja_001_20231116.png)
------------------------------------------------------------------------------
プライマリキーの非クラスタ化インデックスの場合、各行はTiKV の2つの`key-value`ペアエントリで表されます。1つのエントリは、プライマリキーを隠しプライマリキーにマップし、テーブルの一意のインデックスとして機能します。他のエントリは隠されたプライマリキーを行の値にマッピングしますが、それはテーブル構造のレコードとして機能します。そのため、TiDBは、このシナリオでは、隠しプライマリキーのクラスタド・インデックスと同様に、`_tidb_rowid`という名前の隠しプライマリキーカラムも生成します。

プライマリキーに非クラスタ化インデックスを持つテーブルを作成するには、プライマリキーを宣言するときに`NONCLUSTERED`属性を使用します。

TiKV `KV` エントリは、次の`key`と`value` ペアで構成されています。
- インデックスレコードキーは、インデックス `ID` というプレフィックスが付いたプライマリキーの値です。
- インデックスレコードの値は、非表示のプライマリキーカラム（`_tidb_rowid`）です。
- テーブル行のレコードキーは、テーブル`ID`のプレフィックスが付いた非表示のプライマリキーカラム`_tidb_rowid`です。
- テーブル行の値は、その行のすべてのカラムで構成されます。
