这是我的查询和解释输出。
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 | |
+-------------------+------------------+------+-----+---------+-------+
explain语句中的 key_len 字段表示正在使用主键的3列中的2列。为什么是这样?这是在两个不同的列上使用&gt; =和&lt; =运算符的症状吗?
有没有办法优化查询+表?我认为,2004年的“使用位置”可能并不理想。
答案 0 :(得分:4)
根据您的查询,只有该索引中的前两列可用于“范围扫描”。同一范围扫描不能满足第三列的谓词。 (引擎无法减少需要检查的行数。)第三列上的谓词检查将在范围扫描匹配的每一行上执行。
“Using where
”是我们在EXPLAIN输出中所期望的。您是否期望看到不同的东西?
我没有看到任何优化查询的方法,除非我们有一些领域知识允许我们添加一些额外的谓词。由于查询返回表上的所有列,因此主键已经是覆盖索引。 (这是InnoDB还是MyISAM?)
如果表是分段的(大量插入,更新和删除),那么OPTIMIZE TABLE
可能会减少需要检查的块数,但这可能不会产生太大影响