首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我应该在这里创建任何索引来优化查询吗?

问我应该在这里创建任何索引来优化查询吗?
EN

Stack Overflow用户
提问于 2022-04-29 21:17:09
回答 2查看 32关注 0票数 -1

现在,我正在努力弄清楚,我应该做什么,以改善我的查询结果。现在是47.55。

那么,我应该为列创建任何索引吗?请告诉我

代码语言:javascript
复制
SELECT bw.workloadId, lrer.lecturerId, lrer.lastname, lrer.name, lrer.fathername, bt.title, ac.activityname, cast(bw.exactday as char(45)) as "date", bw.exacttime as "time" FROM base_workload as bw
        right join unioncourse as uc on uc.idunioncourse = bw.idunioncourse
        right join basecoursea as bc on bc.idbasecoursea = uc.idbasecourse
        right join lecturer as lrer on lrer.lecturerId = uc.lecturerId
        right join basetitle as bt on bt.idbasetitle = bc.idbasetitle
        right join activity as ac on ac.activityId = bc.activityId
        where lrer.lecturerId is not null AND bc.idbasecoursea is not null and bw.idunioncourse != ""
        ORDER BY bw.exactday, bw.exacttime ASC;
EN

回答 2

Stack Overflow用户

发布于 2022-04-29 22:00:37

来自MySQL 8.0文档:

索引用于快速查找具有特定列值的行。在没有索引的情况下,MySQL必须从第一行开始,然后遍历整个表以找到相关的行。桌子越大,成本就越高。如果表中的列有索引,MySQL可以快速确定要在数据文件中间查找的位置,而不必查看所有数据。这比按顺序读取每一行要快得多。

MySQL使用这些操作的索引:

  • 若要快速查找与WHERE子句匹配的行,请执行以下操作。
  • 从考虑中删除行。
  • 如果表有多列索引,则优化器可以使用索引的任何最左前缀来查找行。
  • 在执行联接时从其他表中检索行。
  • 若要查找特定索引列的MIN()或MAX()值,请执行以下操作。
  • 如果排序或分组是在可用索引的最左边前缀(例如,ORDER BY key_part1, key_part2)上进行的,则对表进行排序或分组。
  • 在某些情况下,可以优化查询以检索值,而无需查阅数据行。

根据您的要求,您可以在WHERE子句上使用索引来更快地检索数据。

票数 1
EN

Stack Overflow用户

发布于 2022-04-30 00:22:55

我想你可以摆脱

代码语言:javascript
复制
           lrer.lecturerId is not null
      AND  bc.idbasecoursea is not null

通过将前3 RIGHT JOINs更改为JOINs。

exactday的数据类型是什么?目的是什么

代码语言:javascript
复制
cast(bw.exactday as char(45)) as "date"

CAST可能是不必要的。

Re bw.exactday,bw.exacttime:通常最好是为DATETIME使用一列而不是两列(日期和时间)。

表的PRIMARY KEYs是什么?

如果可能的话,请转换为LEFT JOIN;我不能把我的头绕在RIGHT JOINs上。

bw上的这个索引可能会有所帮助:INDEX(exactday, exacttime)。

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

https://stackoverflow.com/questions/72063767

复制
相关文章

相似问题

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