0

这是我的查询和解释输出。

explain select * from ENSEMBL_DERIVED where 
SEQ_REGION_ID=27523 AND SEQ_REGION_START >= 12595527 AND SEQ_REGION_END <= 43811979
--------------

*************************** 1. row ***************************
           id: 1
  select_type: SIMPLE
        table: ENSEMBL_DERIVED
         type: range
possible_keys: PRIMARY
          key: PRIMARY
      key_len: 8
          ref: NULL
         rows: 2004
        Extra: Using where
1 row in set (0.00 sec)

这是表格:

describe ENSEMBL_DERIVED
--------------

+-------------------+------------------+------+-----+---------+-------+
| Field             | Type             | Null | Key | Default | Extra |
+-------------------+------------------+------+-----+---------+-------+
| SEQ_REGION_ID     | int(10) unsigned | NO   | PRI | 0       |       |
| SEQ_REGION_START  | int(10) unsigned | NO   | PRI | 0       |       |
| SEQ_REGION_END    | int(10) unsigned | NO   | PRI | 0       |       |
| SEQ_REGION_STRAND | tinyint(2)       | YES  |     | NULL    |       |
| STABLE_ID         | varchar(128)     | YES  |     | NULL    |       |
| DISPLAY_LABEL     | varchar(128)     | YES  | MUL | NULL    |       |
+-------------------+------------------+------+-----+---------+-------+

解释语句中的key_len字段表示主键的 3 列中只有 2 列正在使用。为什么是这样?这是在两个不同列上使用 >= 和 <= 运算符的症状吗?

有没有办法优化查询+表?我认为,在 2004 行上“使用 where”可能并不理想。

4

1 回答 1

4

鉴于您的查询,只有该索引中的前两列可用于“范围扫描”。第三列上的谓词不能满足相同的范围扫描。(引擎无法减少需要检查的行数。)对第三列上的谓词的检查将在范围扫描匹配的每一行上执行。

" Using where" 是我们在 EXPLAIN 输出中所期望的。你期待看到不同的东西吗?

我没有看到任何优化查询的方法,除非我们有一些领域知识可以让我们添加一些额外的谓词。由于查询返回表上的所有列,因此主键已经是覆盖索引。(这是 InnoDB 还是 MyISAM?)

如果表是碎片化的(大量的插入、更新和删除),那么OPTIMIZE TABLE可能会减少需要检查的块的数量,但这不太可能产生太大的影响。

于 2013-08-13T21:52:30.483 回答