「どこで」との句「ORDER BY」との問い合わせのための私のSQLテーブルにインデックスを作成

CVG:

私は、MySQL DB内のテーブルを持っています。私のクエリは次のようになります

SELECT device_id,date,timestamp,power,floor 
from tableData 
where date=%s 
and floor=%s 
order by timestamp desc 
limit 1

私は迅速に結果を得るために私のテーブルの上にインデックスを作成しました。私のインデックス:

+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| Table      | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| minionData |          1 | idx1     |            1 | date        | A         |        9447 |     NULL | NULL   | YES  | BTREE      |         |               |
| minionData |          1 | idx1     |            2 | floor       | A         |       12072 |     NULL | NULL   | YES  | BTREE      |         |               |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

私の質問は、私が使用している特定のクエリのためにあるので、データや床の列に対するインデックスが十分であるか、クエリのパフォーマンスを向上させるためのもタイムスタンプ列のインデックスi、必要がありますか?

GMB:

各単一の列にインデックスを追加すると、データベースが適切に(一つだけインデックスが一度に使用される)クエリを最適化することができません。

で起動するには:最適化するためのwhere句を、次のような両方の列、上の複合インデックスが必要になります。

tableData(date, floor)

しかし、これは、より効率的にするために、あなたもそう、インデックス内のソートに使用される列を追加することができます。

tableData(date, floor, timestamp)

あなたは、MySQL 8.0を実行している場合は、列のインデックス降順を作ることができますtimestamp

tableData(date, floor, timestamp desc)

最後に:一つの選択肢は、あなたのことを他の列を追加することですselectインデックスには、それにするためにカバーするインデックス。これが唯一のインデックスを使用して全体のクエリが実行される可能性があります(つまり、テーブルのデータを見ないで):

tableData(date, floor, timestamp desc, device_id, power) 

MySQLでのインデックスの使用を最適化する方法についての多くの詳細については、私は偉大な読書をお勧めMySQLのインデックスの料理本で書かれたリック・ジェームス(もアクティブSOのユーザーです)。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=8706&siteId=1