2012-09-04 5 views
1

우리는 다음과 같이 우리가 올바른 행을 업데이트하기 위해 절 "에 의해 순서"를를 사용해야하는 업데이트 쿼리가 있습니다복합 인덱스를 사용하여 MySQL에서 업데이트 쿼리를 정렬 할 수 있습니까?

UPDATE `plugin_name_codes` 
USE|FORCE INDEX abc 
SET `plugin_name_entry_id` = 2 
WHERE `plugin_name_codes`.`plugin_name_form_id` = 3 
AND (plugin_name_entry_id IS NULL) 
ORDER BY /*plugin_name_form_id asc, plugin_name_entry_id asc,*/ id ASC 
LIMIT 1 

우리는 ID 열에 대한 정렬을 수행하는 인덱스를 사용하려면,하지만 :

  1. 색인 힌트는 (MySQL 설명서에 따라) UPDATE 쿼리에 사용되지 않습니다.

  2. 은 ORDER BY 절에 상관없이 내가 (즉
    세 조회 열 (plugin_name_entry_id, plugin_name_form_id 및 ID)를 사용하여 , 또는
    단지 첫 2 열 인덱스를 만드는 방법 인덱스를 무시할 것으로 보인다.

  3. 와 상관없이 내가 ORDER BY 절에 포함 된 열을 쿼리 항상 인덱스를 무시합니다.

이 ORDER 절은 각 케에 전체 1 초에 추가 아주 용납 할 수없는 ry. 누구든지 색인을 사용하여 ID 또는 다른 해결 방법으로 정렬 할 수있는 방법을 알고 있습니까?

+0

트랜잭션에서 2 개의 쿼리를 사용하지 않는 이유는 무엇입니까? –

+0

맙소사, 우리가 사용해야 할 UPDATE FOR는 (어떤 이유로) 오랜 시간 동안 데이터베이스를 차단하게됩니다. -/ – btelles

+0

ID에 대한 SELECT를 의미 한 다음 ID를 통한 UPDATE를 의미했습니다. –

답변

0

복합 색인에 대해서 잠깐. 가장 먼저 고려해야 할 것은 데이터를 쿼리하는 방법입니다. (col1, col2)과 같은 복합 키가 있고 SELECT * FROM tbl WHERE col2 = 5을 쿼리하려고하면 SELECT 왼쪽부터 모든 키가 먼저 필요하므로 인덱스가 사용되지 않습니다.

UPDATE의 경우 인덱스가 사용되는 시간은 WHERE (어쩌면 ORDER BY)입니다. 위의 정보를 고려하여 색인의 가장 왼쪽 열 (plugin_name_form_id)이 사용되고 있는지 확인해야합니다. (col1, plugin_name_form_id)의 복합 키가있는 경우 해당 업데이트 문은 색인을 사용하지 않습니다. 유용하게 사용하려면 색인 (plugin_name_form_id, col1)의 순서를 반대로 할 수도 있습니다.

희망이 도움이됩니다.

관련 문제