这两个索引的MySQL表之间有什么区别?

时间:2013-03-27 22:32:07

标签: mysql

我正在修改一个旧的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      |         |
+-----------------+------------+------------+--------------+---------------+-----------+-------------+----------+--------+------+------------+---------+

示例查询在两者之间表现不同:

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 |
+----+-------------+-----------------+------+---------------+------+---------+------+-----------+-----------------+

正如您所料,interactive_old上的查询在几分之一秒内完成,而我在interactive_new上的查询运行约20分钟后再将其杀死。 interaction_old.Complex_pdbid和interaction_new.pdbid是相同的数据类型(并且存储几乎完全相同的数据)。 USE INDEX和/或FORCE INDEX似乎没有任何影响。是什么导致了不同的行为?

编辑:根据文档,第一个表使用loose index scan来提高速度 - 该页面没有任何内容让我清楚为什么这在第二个表上不起作用。

0 个答案:

没有答案