首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >由于增加了一个AND,MySql查询变得非常慢

由于增加了一个AND,MySql查询变得非常慢
EN

Stack Overflow用户
提问于 2020-08-23 01:07:46
回答 2查看 35关注 0票数 0

我有以下查询,运行速度非常快,没有问题(它可能是一个内部连接,但出于调试目的,我将其设置为SELECT/WHERE )

代码语言:javascript
复制
SELECT * 
  from count
     , kanji_info
     , kanji
 WHERE count.drama_uid = 1
   AND count.kanji_uid = kanji_info.kanji_uid
   AND kanji.kanji_uid = kanji_info.kanji_uid

如果我添加最后一个过滤器,查询需要很长时间(从几毫秒跳到大约10秒)

代码语言:javascript
复制
SELECT * 
  from count
     , kanji_info
     , kanji
 WHERE count.drama_uid = 1
   AND count.kanji_uid = kanji_info.kanji_uid
   AND kanji.kanji_uid = kanji_info.kanji_uid
   AND kanji_info.jdpt = 5

列jdpt是在它的表中建立索引的,那么为什么要花这么多时间呢?前三个查询得到一个包含4500个条目的表(总共1.5M个条目),然后删除所有jdpt!=5的条目,但这需要一定的时间。

目前我正在用php做最后一次过滤,但我觉得这很烦人,我想知道我是否在MySql中遗漏了什么。

谢谢

EN

回答 2

Stack Overflow用户

发布于 2020-08-23 01:13:21

您应该使用显式连接,而不是旧的连接模式:

代码语言:javascript
复制
SELECT * 
from count 
     join kanji_info on count.kanji_uid = kanji_info.kanji_uid AND kanji_info.jdpt = 5
     join kanji on kanji.kanji_uid = kanji_info.kanji_uid
WHERE count.drama_uid = 1 

您至少需要在count.kanji_uid、kanji_info.kanji_uid、kanji.kanji_uid和kanji_info.jdpt中建立索引

票数 0
EN

Stack Overflow用户

发布于 2020-08-23 07:59:02

通过使用公共连接语法与where子句。但是,通过关联,如果A=B且B= C,则A= C。因此,由于count表已经有一个Kanji_uid,您可以使用它来获得kanji连接,而不是通过kanji_info

代码语言:javascript
复制
SELECT 
        * 
    from 
        count c
            JOIN kanji_info ki
                ON c.kanji_uid = ki.kanji_uid
                AND ki.jdpt = 5
            JOIN kanji k
                on c.kanji_uid = ki.kanji_uid
    WHERE 
        c.drama_uid = 1

您的主表是count表(它不是很酷,因为count在任何聚合的最基本的时候也是SQL语言中的保留字。

我将有以下索引来优化连接,但也会更改连接条件,这可能会给您一个笛卡尔结果,使其以某种方式生成更多的记录。

上的索引

代码语言:javascript
复制
table       index
count       ( drama_uid, kanji_uid )
kanji_info  ( kanji_uid, jdpt )
kanji       ( kanji_uid )
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63538903

复制
相关文章

相似问题

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