基于外键的简单计数会产生不良结果

时间:2015-10-14 21:12:25

标签: mysql percona

我对以下情况无能为力。让我通过三个简单的查询描述我的麻烦:

SELECT count(1) FROM table WHERE fk1_id = 15;
SELECT count(1) FROM table WHERE fk2_id = 1;
SELECT count(1) FROM table WHERE fk1_id = 15 AND fk2_id = 1;

结果:460,2791和...... 0(零)

除了那个结果还取决于时间。重启引擎后 - 结果非零,一段时间后 - 变为零。 RESET QUERY CACHE - 没有影响。 FLUSH TABLES - 是的,这是临时修复的情况。 table 未基于SHOW ENGINE INNODB STATUS锁定。

引擎:5.6.26-74 Percona Mysql,

CREATE TABLE table (  fk1_id int(11) DEFAULT NULL,  fk2_id int(11) DEFAULT NULL,  KEY (fk1_id),  KEY (fk2_id),  CONSTRAINT c1 FOREIGN KEY (fk1_id) REFERENCES table2 (id),  CONSTRAINT c3 FOREIGN KEY (fk2_id) REFERENCES table3 (id)) ENGINE=InnoDB;

EXPLAIN查询:

select_type: SIMPLE
type: index_merge
key: fk1_id,  fk2_id
rows: 441
Extra: Using intersect(fk1_id,  fk2_id); Using where; Using index 

产生良好结果的解决方法是强制忽略索引,如下面的SQL:

SELECT count(1) FROM video IGNORE INDEX(fk1_id) WHERE fk1_id = 15 AND fk2_id = 1;

我将很感激如何处理这个问题的建议。

PS我已经在SQL Fiddle上创建了模式和测试数据:http://sqlfiddle.com/#!9/7727ee

无关行为的其他说明:

SELECT count(fk1_id) FROM table WHERE fk1_id = 15 AND fk2_id = 1;
SELECT count(other_column_not_covered_by_index) FROM table WHERE fk1_id = 15 AND fk2_id = 1;

第一个SQL结果:0,第二个:433。

0 个答案:

没有答案