Я хочу альтернативный/эффективный/оптимизированный запрос для следующего запроса:
Таблица:
CREATE TABLE `bartco_web_vms_studio`.`table_name` (
`index` INT( 10 ) NOT NULL AUTO_INCREMENT ,
`id1` INT( 10 ) NOT NULL DEFAULT '0',
`id2` VARCHAR( 10 ) NOT NULL,
`f3` TINYINT( 4 ) NOT NULL DEFAULT '0',
PRIMARY KEY ( `index` )
) ENGINE = MYISAM ;
Составной индекс:
CREATE INDEX id1_id2 ON tablename (id1, id2);
Число строк = 7891
Обновить запрос:
UPDATE table_name
SET f3=1
WHERE id1=1 AND id2='a'
OR id1=2 AND id2='b'
OR id1=3 AND id2='c'
В основном мне нужно обновить значение поля на основе двух полей (id1, id2). Эти 2 поля могут быть в более чем 1 паре.
Выход из EXPLAIN SELECT f3 FROM table_name WHERE ...
:
id -> 1,
select type -> SIMPLE,
table -> table_name,
type -> range,
possible_keys -> id1_id2,
key -> id1_id2,
key_len -> 261,
ref -> NULL,
rows -> 2,
Extra -> Using where
Большое спасибо за помощь
Привет
Составной индекс id1 + id2
и запрос
WHERE (id1, id2) IN ((1, 'a'), (2, 'b'), (3, 'c'))
должен помочь
Кроме того, когда вы даже тестируете - добавьте больше строк в таблицу.
Поскольку вы выбираете 3 строки из 9 - mysql может решить никогда не использовать индекс вообще.
UPD
Если ничего из наших ответов не поможет - вы всегда можете разделить свой запрос на 3:
SELECT * FROM table WHERE id1 .. AND id2 ..
UNION
SELECT * FROM table WHERE id1 .. AND id2 ..
...