Mysql - 为什么索引列的计数需要这么长时间?

时间:2014-08-20 06:18:03

标签: mysql database-performance

我是一个简单的查询,计算项目数。 表项有1.5M记录。出于某种原因,运行查询需要65秒! 查询返回30,000

SELECT count(*)
FROM `items`
WHERE `items`.`owner_id`
  IN (1, 2, 3, 4, 5, 6, 7, 8)
AND items.is_hidden = false
编辑:添加'和'完全描述问题的条款

说明显示查询正在使用此索引:

1   SIMPLE  items   range   idx_owner   idx_owner   4   NULL    258 Using index condition; Using where

这些是表格的索引:

items   0   PRIMARY 1   id  A   1444298 NULL    NULL        BTREE       
items   1   items_a951d5d6  1   slug    A   288859  767 NULL        BTREE       
items   1   category_id_refs_id_3b77a81e    1   category_id A   34  NULL    NULL    YES BTREE       
items   1   origin_id_refs_id_99b3fd12  1   origin_id   A   2   NULL    NULL    YES BTREE       
items   1   parent_id_refs_id_99b3fd12  1   parent_id   A   6   NULL    NULL    YES BTREE       
items   1   name    1   name    A   1444298 NULL    NULL        BTREE       
items   1   idx_owner   1   owner_id    A   722149  NULL    NULL        BTREE       

为什么需要这么长时间?有什么方法可以改善吗?

2 个答案:

答案 0 :(得分:1)

尝试使用临时表和JOIN:

CREATE TEMPORARY TABLE owner_ids (id INT PRIMARY KEY);
INSERT INTO owner_ids VALUES (1),(2),(3),(4),(5),(6),(7),(8);

SELECT count(*)
FROM items
JOIN owner_ids ON owner_ids.id = items.owner_id

答案 1 :(得分:1)

尝试创建两列的索引:

CREATE INDEX idx_both_columns ON `items` (`owner_id`, `is_hidden`);