1

私は古い MySQL データベースの修正に取り組んでいます。このデータベースは、保存されているデータの種類に対して不適切に設計されていることが判明しました。私は SQL にまったく詳しくないので、SHOW CREATE TABLE を使用して、古いテーブル ('interaction_old') に使用される CREATE ステートメントを取得し、それをほぼ正確にコピーしました。唯一の変更は、いくつかの列名と新しいテーブルを作成するためのデータ型 ('interaction_new')。古いテーブルでインデックスを使用していた一部のクエリは、新しいテーブルではインデックスを使用しなくなりましたが、その理由がわかりません。

両方のテーブルのインデックスは次のとおりです。

mysql> SHOW KEYS FROM interaction_old;

+-----------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| Table           | Non_unique | Key_name      | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| interaction_old |          0 | PRIMARY       |            1 | interactionid | A         |   138996006 |     NULL | NULL   |      | BTREE      |         |
| interaction_old |          1 | Complex_pdbid |            1 | Complex_pdbid | A         |        1338 |     NULL | NULL   |      | BTREE      |         |
| interaction_old |          1 | Protein_id    |            1 | Protein_id    | A         |       13737 |     NULL | NULL   |      | BTREE      |         |
| interaction_old |          1 | RNA_id        |            1 | RNA_id        | A         |        2806 |     NULL | NULL   |      | BTREE      |         |
+-----------------+------------+---------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+

mysql> SHOW KEYS FROM interaction_new;

+-----------------+------------+------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| Table           | Non_unique | Key_name   | Seq_in_index | Column_name   | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment |
+-----------------+------------+------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+
| interaction_new |          0 | PRIMARY    |            1 | interactionid | A         |   152311144 |     NULL | NULL   |      | BTREE      |         |
| interaction_new |          1 | pdbid      |            1 | pdbid         | A         |        2924 |     NULL | NULL   |      | BTREE      |         |
| interaction_new |          1 | pchainname |            1 | pchainname    | A         |         472 |     NULL | NULL   |      | BTREE      |         |
| interaction_new |          1 | rchainname |            1 | rchainname    | A         |         487 |     NULL | NULL   |      | BTREE      |         |
+-----------------+------------+------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+

そして、2 つの間で動作が異なるクエリの例:

mysql> EXPLAIN SELECT DISTINCT Complex_pdbid FROM interaction_old;

+----+-------------+-----------------+-------+---------------+---------------+---------+------+------+--------------------------+
| id | select_type | table           | type  | possible_keys | key           | key_len | ref  | rows | Extra                    |
+----+-------------+-----------------+-------+---------------+---------------+---------+------+------+--------------------------+
|  1 | SIMPLE      | interaction_old | range | NULL          | Complex_pdbid | 6       | NULL | 1339 | Using index for group-by |
+----+-------------+-----------------+-------+---------------+---------------+---------+------+------+--------------------------+

mysql> EXPLAIN SELECT DISTINCT pdbid FROM interaction_new;

+----+-------------+-----------------+------+---------------+------+---------+------+-----------+-----------------+
| id | select_type | table           | type | possible_keys | key  | key_len | ref  | rows      | Extra           |
+----+-------------+-----------------+------+---------------+------+---------+------+-----------+-----------------+
|  1 | SIMPLE      | interaction_new | ALL  | NULL          | NULL | NULL    | NULL | 152311144 | Using temporary |
+----+-------------+-----------------+------+---------------+------+---------+------+-----------+-----------------+

ご想像のとおり、interaction_old のクエリはほんの一瞬で終了しますが、interaction_new のクエリは約 20 分間実行してから強制終了しました。interact_old.Complex_pdbid とinteraction_new.pdbid は同じデータ型です (そして、ほぼ同じデータを格納しています)。USE INDEX および/または FORCE INDEX は効果がないようです。異なる動作の原因は何ですか?

編集:ドキュメントによると、最初のテーブルは緩やかなインデックス スキャンを使用して速度を上げています。

4

0 に答える 0