1

mysqlにこのクエリがあり、インデックスを作成したかったのですが、最適なインデックス構成は何ですか?

SELECT cometchat.id, cometchat.from, cometchat.to, cometchat.message, cometchat.sent, cometchat.read, cometchat.direction
FROM cometchat
WHERE (
(
cometchat.to =  '30411'
AND cometchat.direction <>2
)
OR (
cometchat.from =  '30411'
AND cometchat.direction <>1
)
)

これらのインデックスを試しましたが、機能しませんでした。

ALTER TABLE  `cometchat` ADD INDEX (  `from`,`to`,`direction`)
ALTER TABLE  `cometchat` ADD INDEX (  `from`,`to`)
ALTER TABLE  `cometchat` ADD INDEX (  `to`,`direction`)
ALTER TABLE  `cometchat` ADD INDEX (  `from`,`direction`)

どんな助けでも大歓迎です。

4

2 に答える 2

1

where 句のため、OR選択を最適化するには 2 つの個別のインデックスが必要になります。

ALTER TABLE  `cometchat` ADD INDEX index1 (  `to`,`direction`)
ALTER TABLE  `cometchat` ADD INDEX index2 (  `from`,`direction`)

これらのカバー インデックスをわざわざ作成しようとはしません。ポイント ルックアップのコストを消費するだけです。ただし、それらをカバーしたい場合は、次のものが必要です。

   ALTER TABLE  `cometchat` ADD INDEX index1 
          ( `to`,`direction`, `message`, `sent`, `read` );
   ALTER TABLE  `cometchat` ADD INDEX index2 
          (  `from`,`direction`,`message`, `sent`, `read`);

カバリング インデックスは最高の選択パフォーマンスを提供しますが、余分なストレージが多くなり、挿入のオーバーヘッドが追加されます。

また、一般的なアドバイスとして、データベース、テーブル、または列に名前を付けるときに「from」などの MySQL 予約語を使用しないようにします。https://dev.mysql.com/doc/refman/5.5/en/reserved-words.html
何かの名前として予約済みを使用すると、別の SP になるバグのあるクエリに実行することを本当に求めています質問 ;)

于 2012-11-05T15:26:56.033 に答える
0

以下のみを使用してみてください。

ALTER TABLE  `cometchat` ADD INDEX (`direction`)
于 2012-11-05T15:26:13.330 に答える