mysql - 索引应该有什么顺序?
问题描述
我有这样的 sql 语句,它从MySQL数据库的 3 个表中聚合数据。查询需要很长时间才能完成。我正在尝试使用索引来加快进程。
SELECT
A.ID_SITE AS OBJECT_ID,
B.SITE_NAME AS OBJECT_NAME,
A.POLYGON,
C.TIME_KEY AS DATE_TIME_KEY,
B.ADDRESS,
B.REGION,
B.DISTRICT,
B.LOCATION,
B.LOCATION_TYPE
FROM TABLE_C AS C
INNER JOIN TABLE_A AS A
ON C.ID_OBJECT = A.ID_SITE
INNER JOIN TABLE_B B
ON A.ID_SITE = B.SITE_ID AND TRACK_IND != 1
WHERE
(C.TIME_KEY BETWEEN '2018-10-01 00:00:00' AND '2018-10-31 23:59:59')
AND
C.ID_TIME_MODE = 3
AND
C.ID_SUBOBJECT_TYPE = 1
AND (
C.CONG_POWER >= 1 OR
C.DIGITAL_POWER >= 3
)
AND
C.ID_OBJECT NOT IN (20158, 26875)
AND
A.MONTH_KEY = '2018-10-01'
我需要一些建议。在我的情况下,创建和使用索引的最佳方式是什么?
我现在做了什么:
CREATE INDEX index_a ON TABLE_A (ID_SITE);
CREATE INDEX index_b ON TABLE_B (SITE_ID, TRACK_IND);
CREATE INDEX index_c ON TABLE_C (TIME_KEY, ID_TIME_MODE, ID_SUBOBJECT_TYPE, CONG_POWER, DIGITAL_POWER, ID_OBJECT)
CREATE INDEX index_a_month_key ON TABLE_A (MONTH_KEY)
;
另外我认为使用运算符会更好FORCE INDEX
,但我很困惑在我的情况下如何正确使用它们。
解决方案
对于您的查询,最好的索引可能是:
TABLE_C(ID_TIME_MODE, ID_SUBOBJECT_TYPE, TIME_KEY, CONG_POWER, DIGITAL_POWER, ID_OBJECT)
TABLE_A(ID_SITE, MONTH_KEY)
TABLE_B(SITE_ID)
推荐阅读
- sql - SQL查询条件在where
- flutter - 在关闭并重新打开它后让 gif 从头开始
- java - JPA 实体到 DTO 映射创建深拷贝
- sql - 获取财政年度查询中的动态日期范围的逻辑
- huggingface-transformers - 来自 pytorch_transformers ModuleNotFoundError:没有名为“utils”的模块
- input - 如何为音乐教育平台创建节奏敲击输入
- github - 如何在 GitHub Actions 中使用 env 文件?
- c++ - 使用 Makefile 中的头文件编译 Pybind(不使用 cmake)
- spring-boot - Spring Boot 微服务中的 JWT 安全性
- entity-framework - EF Core 3.0 1:0 与fluent的关系