这是我的查询和解释输出。
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 列被使用。为什么是这样?这是在两个不同的列上有 >= 和 <= 运算符的症状吗?
有没有办法优化查询+表?我认为,在 2004 行上“使用哪里”可能并不理想。
最佳答案
给定您的查询,只有该索引中的前两列可用于“范围扫描”。第三列的谓词不能满足相同的范围扫描。 (引擎无法减少需要检查的行数。)第三列的谓词检查将在范围扫描匹配的每一行上执行。
“Using where
”是我们在 EXPLAIN 输出中所期望的。您是否希望看到一些不同的东西?
我看不到任何优化查询的方法,除非我们有一些领域知识可以让我们添加一些额外的谓词。由于查询返回表中的所有列,因此主键已经是一个覆盖索引。 (这是 InnoDB 还是 MyISAM?)
如果表是碎片化的(大量插入、更新和删除),那么 OPTIMIZE TABLE
可能会减少需要检查的 block 数,但这不太可能差别很大。
关于mysql - 为什么不使用完整 key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18219611/