Mysql WHERE子句大大降低了SELECT查询的速度

Mysql WHERE子句大大降低了SELECT查询的速度,mysql,Mysql,我有一个简单的问题: SELECT distinct state FROM customers WHERE country = 'us' 这个想法是为了得到一份美国客户居住的州的清单 我有大约800k行,在州和国家上有索引。这个查询大约需要4秒才能运行,这太长了,因为这需要实时进行 如果我删除WHERE子句,它几乎会立即计算出来。我研究了原因,当我使用WHERE子句对查询运行explain时,它没有使用state索引。当我去掉WHERE子句时,它再次开始使用状态索引。为什么会发生这种情况,有没

我有一个简单的问题:

SELECT distinct state FROM customers WHERE country = 'us'
这个想法是为了得到一份美国客户居住的州的清单

我有大约800k行,在
州和
国家上有索引。这个查询大约需要4秒才能运行,这太长了,因为这需要实时进行

如果我删除
WHERE
子句,它几乎会立即计算出来。我研究了原因,当我使用WHERE子句对查询运行
explain
时,它没有使用
state
索引。当我去掉WHERE子句时,它再次开始使用状态索引。为什么会发生这种情况,有没有办法让它同时使用这两个索引

我浏览了其他类似的问题,但对于我发现的问题,它们是非常复杂的查询,解决方案只是一个查询重写。虽然这很简单,但我认为它触及了问题的核心

更新:

我发现,如果我在
us\u state
上做一个索引,它可以在大约.5s内工作,这就足够了。不过,我希望在某个时刻将多个部分添加到
WHERE
子句中,因此为所有部分创建复合索引仍然不是最优的。因此,我将这个问题留待讨论,寻找更好的解决方案

创建表

CREATE TABLE `customers` (
`country` varchar(5) DEFAULT NULL,
`st` varchar(50) DEFAULT NULL,
KEY `state` (`state`),
KEY `country` (`country`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1

此答案应为您提供一个解决方案:

简而言之,运行Analyze函数,看看它是否加快了速度

ANALYZE TABLE CUSTOMERS;

只是检查一下,因为有时候mysql查询计划器是疯狂的,你会从客户那里得到类似的结果吗?country='us'按州分组
?是的,不幸的是,
按州分组
也需要4个左右。我建议你为country='us'添加一个通用的数字索引,并在上面做一个WHERE。MySQL在处理任何文本时都非常糟糕。数字,它可以处理得很好。另外,这些索引的基数是什么?请发布您的
CREATE TABLE
语句,无论您在一个实际上不存在的列上有索引,还是在编辑CREATE TABLE时损坏了某些内容。能否显示
show CREATE TABLE
的实际输出?遗憾的是,这并没有减少查询时间。