MySQL:从特定列中选择值非常慢

MySQL:从特定列中选择值非常慢,mysql,performance,select,innodb,where-clause,Mysql,Performance,Select,Innodb,Where Clause,我有一个名为key\u word的mysql数据库。它有3列,2300万行 请看下面的查询 SELECT `indexVal` FROM `key_word` WHERE `hashed_word`='001' 此查询大约需要6秒钟才能显示结果。结果包含169669行。这是非常非常缓慢的。但是,我注意到,只有当我试图在indexVal中获取记录时,才会发生这种情况。以下所有查询都非常快速 SELECT `primary_key` FROM `key_word` WHERE `hashed_wo

我有一个名为
key\u word
的mysql数据库。它有3列,2300万行

请看下面的查询

SELECT `indexVal` FROM `key_word` WHERE `hashed_word`='001'
此查询大约需要6秒钟才能显示结果。结果包含169669行。这是非常非常缓慢的。但是,我注意到,只有当我试图在
indexVal
中获取记录时,才会发生这种情况。以下所有查询都非常快速

SELECT `primary_key` FROM `key_word` WHERE `hashed_word`='001'
SELECT `hashed_word` FROM `key_word` WHERE `indexVal`=0
所有这3列都是单独索引的,所以我不明白当我试图通过搜索
hash_word
indexVal
获取数据时,为什么速度很慢

下面是我的表格结构

下面是关于该表的更多信息

那么,为什么从
indexVal
中选择而从
hash_-word
中搜索会很慢呢?我怎样才能解决这个问题

更新

根据要求,我将公布调查结果

EXPLAIN SELECT `indexVal` FROM `key_word` WHERE `hashed_word`='001'
下面

更新

的结果显示变量,如“%query\u cache\u size%”;显示变量,如“%query\u cache\u type%”在下面


从哈希值为'001'的关键字中选择主键
比从哈希值为'001'的关键字中选择indexVal快
因为在InnoDB中主键值总是包含在任何二级索引中;这意味着从索引中读取主键。然而,在第二个查询中,MySQL首先从索引中读取主键,然后从表行中读取indexVal的值。换句话说,它可以读取2倍的磁盘

您可以尝试对
散列单词和
索引val
(按该顺序)建立索引


基于
散列单词
的标准,此索引将快速进行选择,并且索引的索引数据中包含
indexVal
,因此不需要从磁盘读取数据

运行
explain-select-indexval from…
并添加结果。两个更快的查询返回多少行?@GordonLinoff:谢谢您的回复。查询
从“关键字”中选择“主键”,其中“哈希关键字”='001'
非常快地返回169669行。@juergend:谢谢您的回复。我用请求的信息更新了我的问题。当运行
选择distinct indexval…
时会发生什么情况?确定。那么,我该如何改进我的索引呢?创建复合索引(hashd_word,indexVal)——通过这种方式,您将从索引中读取所需的所有数据。这称为
索引覆盖查询
谢谢。我的数据库知识很低,因为我在计算机视觉和高性能计算领域。你能帮我查询吗,step step?
ALTER TABLE key\u word DROP INDEX hashed\u word,ADD INDEX(hashed\u word,indexVal)
谢谢你的回复,这看起来像是一次创建两个索引?我怎么能做到这一点呢?我还没有测试过,但我认为以下应该可以工作:
altertablekey\uwordaddindex val\uhashed(hashed\uword,indexVal)
(您创建的不是两个索引,而是一个具有两列的索引,按正确顺序排列。)(
val_hashed
只是新索引的名称,您可以省略或自由选择。)