这个查询会使用索引吗?

时间:2012-05-28 20:12:31

标签: mysql sql indexing

我有一张看起来像这样的大桌子:

CREATE TABLE `images` (
  `image_id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `user_id` int(10) unsigned NOT NULL,
  `data` mediumblob,
  PRIMARY KEY (`user_id`,`image_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8

我必须运行一个压缩blob字段的查询。 MySQL是否能够使用以下查询的索引:

UPDATE images SET data = COMPRESS(data) WHERE (user_id = ? AND image_id = ?) OR (user_id = ? AND image_id = ?) OR (...) OR (...);

我必须这样做,因为我无法在单个查询中更新整个表格而且只能使用user_id进行更新。

编辑:explainupdate不起作用,你们知道吗,对吗?

5 个答案:

答案 0 :(得分:2)

是的,您的更新将使用表中的索引,因为WHERE之后引用的唯一列是您的主键所代表的。

如果您不确定查询将使用什么,请随意使用EXPLAIN命令: http://dev.mysql.com/doc/refman/5.0/en/explain.html

答案 1 :(得分:2)

使用

EXPLAIN SELECT data FROM images
  WHERE (user_id = ? AND image_id = ?)
    OR (user_id = ? AND image_id = ?)
    OR (...)
    OR (...);

答案 2 :(得分:1)

在您的示例中,我希望MySQL使用主键作为聚簇索引。这意味着索引存储所有列,实际上是磁盘上唯一的数据版本。

所以是的,它将使用索引。在包含or s的条件下,我希望MySQL扫描索引(不是搜索。)

答案 3 :(得分:1)

最好使用EXPLAIN进行检查,而不是过多推测。

在运行EXPLAIN之前,请发出ANALYZE TABLE以确保查询优化程序最有可能找到最佳查询计划。

答案 4 :(得分:1)

是的,它很可能会使用索引(除非您的条件具有非常低的基数)。

MySQL也支持这种语法:

(user_id, image_id) IN ((user1, image1), (user2, image2), (user3, image3))

但是这个不会使用索引(这只是一个实现缺陷)。

您也可以使用此查询:

UPDATE  (
        SELECT  user1 AS user_id, image1 AS image_id
        UNION ALL
        SELECT  user2 AS user_id, image2 AS image_id
        UNION ALL
        SELECT  user3 AS user_id, image3 AS image_id
        ) q
JOIN    images i
ON      (i.user_id, i.image_id) = (q.user_id, q.image_id)
SET     i.data = COMPRESS(i.data)

也将使用索引。