首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为带有"where“和"order”子句的查询创建sql表索引

为带有"where“和"order”子句的查询创建sql表索引
EN

Stack Overflow用户
提问于 2020-02-18 13:18:21
回答 2查看 94关注 0票数 3

我在mysql数据库中有一张表。我的查询看上去像是

代码语言:javascript
复制
SELECT device_id,date,timestamp,power,floor 
from tableData 
where date=%s 
and floor=%s 
order by timestamp desc 
limit 1

为了更快的结果,我在我的表上创建了索引。我的索引:

代码语言:javascript
复制
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+
| 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      |         |               |
+------------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+

因此,我的问题是,对于我所使用的特定查询,数据和楼层列的索引足够好,还是应该在时间戳列上索引,以提高查询性能?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-02-18 13:25:45

向每个列添加索引不允许数据库正确地优化查询(一次只使用一个索引)。

首先:要优化where子句,需要对两列进行复合索引,如下所示:

代码语言:javascript
复制
tableData(date, floor)

但是,为了提高效率,您还可以添加用于在μndex中排序的列,因此:

代码语言:javascript
复制
tableData(date, floor, timestamp)

如果运行的是MySQL 8.0,则可以使索引降到列timestamp

代码语言:javascript
复制
tableData(date, floor, timestamp desc)

最后:一个选项是添加索引中select的其他列,使其成为覆盖索引;这可能允许只使用索引执行整个查询(即不查看表数据):

代码语言:javascript
复制
tableData(date, floor, timestamp desc, device_id, power) 

有关如何优化MySQL中索引的使用的更多信息,我建议您阅读由里克·詹姆斯 (也是active SO用户)编写的伟大的MySQL索引食谱

票数 4
EN

Stack Overflow用户

发布于 2020-02-18 13:56:57

向每个列添加索引并不能保证数据库优化,时间戳可能用于排序或筛选。

只需使用tableData(日期、楼层)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60281828

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档