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のユーザーです)。