queue_name
,priority
およびmessage_timestamp
の表を考慮してください。 SELECTのためにEXPLAINMySQL ORDER BY:SELECTおよびUPDATEの異なる説明
CREATE INDEX STATE_QUEUENAME_PRIORITY_TIMESTAMP ON
`queue_messages` (queue_name, state, priority, message_timestamp);
:ここ
は、そのための化合物の指標である(!同じWHERE
と
ORDER BY
付き)UPDATE用のEXPLAIN
Using where; Using index
EXPLAIN SELECT message_timestamp
from queue_messages
WHERE queue_name = 'folder'
AND state = 0
ORDER BY priority DESC, message_timestamp DESC
LIMIT 1;
戻り値:
EXPLAIN UPDATE queue_messages
SET state = 1
WHERE queue_name = 'folder'
AND state = 0
ORDER BY priority DESC, message_timestamp DESC
LIMIT 1;
それは重大なパフォーマンスへの影響(50K行の90msののUPDATE対SELECTが20ms)を引き起こす
から
戻りUsing where; Using filesort
。
MariaDB(MySQL)がUPDATE文でfilesort
を取り除くには、どうすればよいですか? update
については
インデックスのヒントを教えてください。https://dev.mysql.com/doc/refman/5.7/en/index-hints.html – RiggsFolly
私は確かに分かりませんが、あなたは状態の一部を更新しています鍵はそうではないかもしれません。 –
これは唯一のインデックスですか? –