我在mysql数据库中有一张表。我的查询看上去像是
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 | | |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+因此,我的问题是,对于我所使用的特定查询,数据和楼层列的索引足够好,还是应该在时间戳列上索引,以提高查询性能?
发布于 2020-02-18 13:25:45
向每个列添加索引不允许数据库正确地优化查询(一次只使用一个索引)。
首先:要优化where子句,需要对两列进行复合索引,如下所示:
tableData(date, floor)但是,为了提高效率,您还可以添加用于在μndex中排序的列,因此:
tableData(date, floor, timestamp)如果运行的是MySQL 8.0,则可以使索引降到列timestamp上
tableData(date, floor, timestamp desc)最后:一个选项是添加索引中select的其他列,使其成为覆盖索引;这可能允许只使用索引执行整个查询(即不查看表数据):
tableData(date, floor, timestamp desc, device_id, power) 有关如何优化MySQL中索引的使用的更多信息,我建议您阅读由里克·詹姆斯 (也是active SO用户)编写的伟大的MySQL索引食谱。
发布于 2020-02-18 13:56:57
向每个列添加索引并不能保证数据库优化,时间戳可能用于排序或筛选。
只需使用tableData(日期、楼层)
https://stackoverflow.com/questions/60281828
复制相似问题