我对以下情况无能为力。让我通过三个简单的查询描述我的麻烦:
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。