我有一个很大的表(大约30M行),它通常运行得很快(每个请求5-6ms).有时一个请求需要花费很多时间(大约60秒).
下面是表格 struct :
CREATE TABLE table (
id int(11) NOT NULL,
A int(11) NOT NULL,
B varchar(32) NOT NULL,
C tinyint(1) NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1;
ALTER TABLE `table`
ADD PRIMARY KEY (id),
ADD KEY A (A),
ADD KEY B (B);
索引A的基数为2m,索引B的基数为1k.
我的请求是:
SELECT * FROM table
WHERE A = someAvalue
AND B = 'some B value'
AND C = 0
ORDER BY id DESC
LIMIT 1;
以及解释的结果:
id|select_type|table|type|possible_keys|key|key_len|ref |rows|Extra
1 |SIMPLE |table|ref |A,B |B |34 |const|1 |Using index condition; Using where; Using filesort
key_len
和rows
与本例无关,因为它来自示例查询
如果我删除AND C = 0
个请求,则运行正常时间量.当索引A和B没有返回值时,这个请求似乎变得疯狂了.
所以这里我的问题是:为什么在这种情况下添加一个非索引字段可以使请求在60秒以上而不是几毫秒内运行?