我有一张看起来像这样的大桌子:
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
进行更新。
编辑:explain
和update
不起作用,你们知道吗,对吗?
答案 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)
也将使用索引。