"queue"という大きなテーブルがあります。今は1200万レコードあります。MySQLのパフォーマンス - 大きなテーブルからの選択と削除
CREATE TABLE `queue` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`userid` varchar(64) DEFAULT NULL,
`action` varchar(32) DEFAULT NULL,
`target` varchar(64) DEFAULT NULL,
`name` varchar(64) DEFAULT NULL,
`state` int(11) DEFAULT '0',
`timestamp` int(11) DEFAULT '0',
`errors` int(11) DEFAULT '0',
PRIMARY KEY (`id`),
UNIQUE KEY `idx_unique` (`userid`,`action`,`target`),
KEY `idx_userid` (`userid`),
KEY `idx_state` (`state`)
) ENGINE=InnoDB;
複数PHP労働者(150)は、同時に、このテーブルを使用します。
レコードを選択し、選択したデータを使用してネットワーク要求を実行し、レコードを削除します。
selectクエリとdeleteクエリから実行時間が混在しています。 deleteコマンドはテーブルをロックしていますか?
このシナリオにはどのようなアプローチが最適でしょうか?
記録+ NETWORK要求は+記録に
を削除]を選択し完了として(私もしたくない時からのcronを使用して完成したレコードをDELETE +記録+ NETWORK要求+ MARKレコードを選択大きなテーブル)。
注:キューは1分ごとに新しいレコードを取得しますが、INSERTクエリはここでは問題になりません。
何か助けていただければ幸いです。
データベースをキューとして使用していて、複数のクライアントから作業している場合は、ロック競合が発生する可能性があります。データベースをキューとして使用しようとすると、誰もが苦労します。代わりに、データベースではなく、実際のメッセージキューソフトウェアを使用する必要があります。 ActiveMQやBeanstalkd、RabbitMQ、Resqueのようなもの。 –
これは、特にクエリのパフォーマンスに関する部分を読むと参考になるでしょう。 http://meta.stackoverflow.com/a/271056/あなたの質問を編集して詳細を知りたいかもしれません。 –