mysql - 为什么不使用完整 key ?

标签 mysql

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

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/

相关文章:

php - 在 View 中查找主键列

php - 通知: Array to string conversion in error when requesting data from a databse

javascript - 如何使用php在mysql数据库数据更改上自动发送短信

MySQL 向上扩展还是向外扩展?

PHP 准备了具有多个 LIKE 条件的 SQL

mysql - 是否可以在 txt 文件中记录我过去一小时运行的 mysql 查询?

mysql - 使用多对多相同类型关系表排除 SELECT 上的相似行

java - 当 child 被 orphanRemoval 删除时,EntityListener 不起作用

php - 从 yii 2 中的其他表按计数(*)排序

php - 尝试使用MySQL返回用户信息