私はチャットメッセージのテーブルが4m以上の行に成長しています。大規模なテーブルで日付範囲を最適化する
特定の期間内にユーザーとの間でメッセージを送受信する必要があります。
最初はこのクエリは大丈夫でしたが、テーブルの現在のサイズでは長すぎます(> 10秒)。
私は多くのインデックスの組み合わせを作成しようとしました。 MySQLはmessageType + sentDateに複合インデックスを使用しています
SELECT `ofMessageArchive`.*
FROM `ofMessageArchive`
WHERE `ofMessageArchive`.`messageType` IN ('Message')
AND (ofMessageArchive.fromJID = '[email protected]' OR ofMessageArchive.toJID = '[email protected]')
AND (ofMessageArchive.sentDate > '1462235333109')
ORDER BY ofMessageArchive.sentDate ASC LIMIT 50
どのように私はこのクエリを最適化できますか?
[EDIT] EXPLAIN
結果:
+----+-------------+------------------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------+---------+-------+--------+-------------+
| id | select_type | table | type | possible_keys | key | key_len | ref | rows | Extra |
+----+-------------+------------------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------+---------+-------+--------+-------------+
| 1 | SIMPLE | ofMessageArchive | ref | index_ofMessageArchive_on_fromJID_and_toJID,index_ofMessageArchive_on_sentDate,index_ofMessageArchive_on_messageType,idxMessageTypeSentDate,ofMessageArchive_fromjid_idx,ofMessageArchive_tojid_idx | idxMessageTypeSentDate | 767 | const | 731570 | Using where |
+----+-------------+------------------+------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+------------------------+---------+-------+--------+-------------+
結果を説明し、このクエリ –
追加の 'EXPLAIN'結果を入力してください – Paludis