2016-04-11 65 views
1

我做在mysql命令行此查询(不通过任何类型的代码)我InnoDB表返回0的COUNT(*)

select count(*) from books where 
publisher_id = 46 AND deleted = 0 AND status_id = 3; 

返回0(有时),但除去计数,它有很多结果。

这可能是什么原因造成的?我扔在命令行此查询(不通过任何一种编程层)

解释数查询得到:

Using intersect(IDX_cms_books_publisher_id,IDX_cms_books_status_id,IDX_cms_books_deleted); Using where; Using index 
+0

'返回0(有时),但删除计数,它有很多结果。'什么'有时'的意思是? – Pred

+0

444,282205220 ........(它太大了,这里是查询,如果你怀疑) select * from books where publisher_id = 46 AND deleted = 0 AND status_id = 3 LIMIT 1 –

+0

https ://www.percona.com/blog/2012/12/14/the-optimization-that-often-isnt-index-merge-intersection/+ – DanFromGermany

回答

4

这个问题似乎是与MySQL的错误。这是由索引合并交叉引起的。

您可以将其设置为每个会话 SET SESSION optimizer_switch =“index_merge_intersection = off”;

或全局设置它在你的my.cnf

的[mysqld] optimizer_switch = index_merge_intersection =在这里下车

http://bugs.mysql.com/bug.php?id=81031

0

申请

错误报告,则可以既避免故障和通过添加“复合”索引使查询更快:

INDEX(publisher_id, deleted, status_id) 

(的列可以是任何顺序。)

如果PARTITION BY HASH涉及,或许bug 70588是参与。它被固定在5.5.36,5.6.16,5.7.4。