2010-12-01 5 views
0

Я хочу альтернативный/эффективный/оптимизированный запрос для следующих запросов:MySQL - альтернативный/эффективный/оптимизированный запрос

Таблица:

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 

Большое спасибо за помощь

С уважением

+1

У вас есть индекс для ID1, ID2? – InSane 2010-12-01 03:39:58

+0

@ InSane - хороший вопрос, +1. Просто чтобы расширить это, идеальный индекс включает в себя как id1, так и id2 в одном индексе. Просто хотел сказать, что это вопрос новичков. – 2010-12-01 03:43:04

ответ

2

Композитный индекс 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 .. 
... 
Смежные вопросы