这两个索引MySQL表之间有什么区别?
我正在修改一个旧的MySQL数据库,该数据库的设计与它存储的数据类型不符。我对SQL不是很熟悉,所以我使用SHOW CREATE TABLE来获取用于旧表“interaction\u old”的CREATE语句,并几乎完全复制了它,唯一的更改是一些列名和数据类型,以创建一个新表“interaction\u new”。现在一些在旧表中使用索引的查询不再在新表中使用索引,我不明白为什么 以下是两个表中的索引:这两个索引MySQL表之间有什么区别?,mysql,Mysql,我正在修改一个旧的MySQL数据库,该数据库的设计与它存储的数据类型不符。我对SQL不是很熟悉,所以我使用SHOW CREATE TABLE来获取用于旧表“interaction\u old”的CREATE语句,并几乎完全复制了它,唯一的更改是一些列名和数据类型,以创建一个新表“interaction\u new”。现在一些在旧表中使用索引的查询不再在新表中使用索引,我不明白为什么 以下是两个表中的索引: mysql> SHOW KEYS FROM interaction_old; +-
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 |
+----+-------------+-----------------+------+---------------+------+---------+------+-----------+-----------------+
正如您所料,interaction_old的查询在几分之一秒内完成,而interaction_new的查询在终止之前已经运行了约20分钟。interaction_old.Complex_pdbid和interaction_new.pdbid是相同的数据类型,存储的数据几乎完全相同。使用索引和/或强制索引似乎没有任何效果。是什么导致了不同的行为
编辑:根据文档,第一个表使用了一个参数来提高速度-但该页面中没有任何内容向我明确说明为什么第二个表不能使用该参数。分析表,优化表?PS:你为什么用那种方式储存?为什么没有一个引用表呢?如果“引用表”指的是一个包含不同pdbid的表,我确实有一个,但我遇到的另一个问题是从interaction_new中选择不同的pdbid、pchainname、rchainname,为其他两个键提供一个引用表是没有意义的;我只是使用这个查询,因为它更简单。关于优化表:这会让MySQL决定使用以前没有使用的索引,还是仅仅提高已经使用的索引的性能?运行它需要一段时间,所以我不希望是后者,但我遇到的另一个问题是创建一个包含所有3列的复合索引。我之所以使用这个查询,是因为它更简单,但这并不意味着它们应该以类似的方式进行优化。当所有三列都已单独索引时,有没有理由我需要创建一个复合索引?另外,我仍然想了解原始问题中查询之间存在差异的原因,只是为了改进我对索引的理解,尽管这并不是我实际问题的根源。当所有三列都已单独索引时,有没有理由我需要创建一个复合索引?-是的,有-mysql每个查询只能使用一个表索引。不确定性能的差异-我的建议是解决问题的根源,而不是后果。