我有以下查询,运行速度非常快,没有问题(它可能是一个内部连接,但出于调试目的,我将其设置为SELECT/WHERE )
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秒)
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中遗漏了什么。
谢谢
发布于 2020-08-23 01:13:21
您应该使用显式连接,而不是旧的连接模式:
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中建立索引
发布于 2020-08-23 07:59:02
通过使用公共连接语法与where子句。但是,通过关联,如果A=B且B= C,则A= C。因此,由于count表已经有一个Kanji_uid,您可以使用它来获得kanji连接,而不是通过kanji_info。
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语言中的保留字。
我将有以下索引来优化连接,但也会更改连接条件,这可能会给您一个笛卡尔结果,使其以某种方式生成更多的记录。
上的索引
table index
count ( drama_uid, kanji_uid )
kanji_info ( kanji_uid, jdpt )
kanji ( kanji_uid )https://stackoverflow.com/questions/63538903
复制相似问题